地址需要多少字节?

时间:2013-10-25 19:29:46

标签: c memory

基本上我的问题是单个地址需要多少字节?

我的意思是char在我的平台上占用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

0xdeadbeef0xdeadbef3之间的地址会怎样?它们都保留给i吗?当我指向0xdeadbeee(应该只是一个地址|字节或i下的任何内容)并更改它的值时,我会发生什么?

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

我希望现在更清楚了。

6 个答案:

答案 0 :(得分:2)

你怎么能找到这个?怎么样:

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

但是,正如@ H2CO3指出的那样,你真的在​​问pointer arithmetic。阅读更多信息,了解更多信息。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用sizeof找出指针占用的字节数:

size_t int_ptr_size = sizeof(int*);

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

答案 3 :(得分:1)

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

如果i位于0xdeadbeef,则0xdeadbeef, 0xdeadbef0, 0xdeadbef1, and 0xdeadbef2字节地址将全部用于存储i。如果您要将iPtr设置为0xdeadbeee并写入值0xdeadbeee,则以下三个地址将包含您编写的值。如果您随后尝试阅读ci,则会发现该值已损坏。

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

答案 4 :(得分:0)

地址是指数据的开头。因此,地址的大小不会根据数据的大小而改变。

然而,地址的实际大小取决于平台。在许多较新的系统上,该大小将为64位。但是,如果不了解您的平台,我们就无法说出来。

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

答案 5 :(得分:0)

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