基本上我的问题是单个地址需要多少字节?
我的意思是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
0xdeadbeef
和0xdeadbef3
之间的地址会怎样?它们都保留给i
吗?当我指向0xdeadbeee
(应该只是一个地址|字节或i
下的任何内容)并更改它的值时,我会发生什么?
编辑: 对于那些仍然会回答的人,我不想知道整数有多大。我想知道在占用4个字节的内存时是否还有4个地址,以及在更改其中一个地址值时会发生什么(如果它有4个地址)。
我希望现在更清楚了。
答案 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
,则以下三个地址将包含您编写的值。如果您随后尝试阅读c
或i
,则会发现该值已损坏。
需要考虑的一些事项:并非所有架构都允许字节寻址。 char
可能是系统中的一个字节,但由于限制,可能会保留4个字节。同样,您可能无法读取或写入指向未对齐地址的指针。例如,只能访问32位边界内存的系统只能访问0xdeadbeec
或0xdeadbef0
。
答案 4 :(得分:0)
地址是指数据的开头。因此,地址的大小不会根据数据的大小而改变。
然而,地址的实际大小取决于平台。在许多较新的系统上,该大小将为64位。但是,如果不了解您的平台,我们就无法说出来。
您可以在代码中使用sizeof()
来获取地址的大小。
答案 5 :(得分:0)
一切都取决于您的硬件平台内存组织。 如果存储器以4字节单元组织,则长度低于或等于4字节的变量(假设正确的存储器调整)仅保存在一个存储器单元中,因此仅由一个地址值指向。 / p>