3

基本上我的问题是单个地址占用/拥有多少字节?

我的意思是 achar在我的平台上占用 1 个字节并且有 1 个地址。但是一个int需要4个字节。这需要多少个地址int?它仍然只有 1 个地址还是有 4 个?

例如 :

char c = 'A'; //Address at 0xdeadbeee
int i = 45846; //Address at 0xdeadbeef
int* iPtr = &i;
iPtr++; //Address at 0xdeadbef3 now

0xdeadbeef和之间的地址会发生什么0xdeadbef3?他们都保留i吗?当我指向0xdeadbeee(应该是一个地址 | byte 或任何下的任何内容i)并更改它的值时,i 会发生什么?

编辑:对于那些仍然会回答的人,我不想知道整数有多大。我想知道在占用 4 个字节的内存时它是否也有 4 个地址,以及在更改其中一个地址的值时会发生什么(如果它有 4 个地址)。

我希望现在更清楚了。

4

6 回答 6

2

你怎么会发现这个?怎么样:

printf("%zu\n", sizeof(iPtr));

但是,正如@H2CO3 指出的那样,您实际上是在询问指针算法。阅读更多内容以获取更多信息。

于 2013-10-25T19:33:03.523 回答
2

是的,地址&i+1byte是第二个字节的地址i

如果您住在 Memory Street 100 的 4 栋房屋中,则您有四个地址。但这些地址针对不同的建筑物。虽然,根据您的邮政服务,如果不是规范地址,邮件可能无法投递(内存访问也是如此 - 取决于平台)。

于 2013-10-25T19:33:41.540 回答
2

内置类型(char、short、int、long)的大小是特定于实现和平台的。如果我们假设您的 int 是 32 位,那么我们可以解决您的一些问题:

如果i驻留在0xdeadbeef,则0xdeadbeef, 0xdeadbef0, 0xdeadbef1, and 0xdeadbef2字节地址将全部用于存储i。如果您要设置iPtr0xdeadbeee写入一个值,0xdeadbeee那么以下三个地址将包含您写入的值。如果您随后尝试读取cor i,您会发现该值已损坏。

需要考虑的一些事项:并非所有架构都允许字节寻址。Achar在您的系统上可能是一个字节,但由于限制,可能会保留 4 个字节。同样,您可能无法读取或写入指向非对齐地址的指针。例如,只能访问 32 位边界内存的系统只能访问0xdeadbeec0xdeadbef0.

于 2013-10-25T19:36:11.130 回答
1

您可以使用以下命令找出指针占用的字节数sizeof

size_t int_ptr_size = sizeof(int*);

如果您尝试通过未正确对齐类型的指针访问数据,则会调用未定义的行为,因此无法预测会发生什么。在某些架构上,程序会因Bus Error而崩溃。

于 2013-10-25T19:34:11.353 回答
0

地址指的是数据的开始。所以地址的大小不会根据数据的大小而改变。

但是,地址的实际大小将取决于平台。在许多较新的系统上,该大小将是 64 位。但是我们不能在不知道您的平台的情况下准确地说。

您可以sizeof()在代码中使用来获取地址的大小。

于 2013-10-25T19:32:56.147 回答
0

一切都取决于您的硬件平台内存组织。如果内存以 4 字节单元组织,则长度小于或等于 4 字节的变量(假设内存调整正确)仅保存在单个内存单元中,因此仅由单个地址值指向。

于 2013-10-25T19:42:26.603 回答