我的节目如下:
#include <stdio.h>
#include <stdlib.h>
int* testPointerReturnType();
int main(void)
{
int x = 2;
printf("Value of x is %d and its address is %p\n", x, &x);
int* y = testPointerReturnType();
printf("Value of y is %d and its address is %p\n", *y, y);
}
int* testPointerReturnType()
{
int x = 33;
int r = 99;
return &x;
}
以下是我的整体o / p(我将在下面的问题中讨论这个问题):
// This is with ** int r = 99; ** line commented
jharvard@appliance (~/psets/pset5/pset5_test): ./PointerAddresss
Value of x is 2 and its address is 0xbfdba7c4
Value of y is 33 and its address is 0xbfdba794
jharvard@appliance (~/psets/pset5/pset5_test): size PointerAddresss
text data bss dec hex filename
1250 280 4 1534 5fe PointerAddresss
// This is with ** int r = 99; ** line un-commented
jharvard@appliance (~/psets/pset5/pset5_test): ./PointerAddresss
Value of x is 2 and its address is 0xbf8a98e4
Value of y is 33 and its address is 0xbf8a98b4
jharvard@appliance (~/psets/pset5/pset5_test): size PointerAddresss
text data bss dec hex filename
1266 280 4 1550 60e PointerAddresss
jharvard@appliance (~/psets/pset5/pset5_test):
以下是我的问题:
int r = 99;
作为评论,那么我会在文字和dec中得到1250
。如果我取消注释,那么我得到1266
,这基本上意味着增加16个内存位置,但是为什么增加16个内存位置时4个字节的int?另外,我知道文本/代码段然后是什么dec
? 答案 0 :(得分:7)
除非堆栈的大小再次增加到足以覆盖该值,否则内存位置仍然可以保留该值,但是您正在基于未定义的行为进行操作。 可能意味着没有其他函数被调用,但可能意味着没有其他函数需要在堆栈上分配那么多空间才能运行。
您看到分配的内存超出预期的原因是堆栈对齐。如果您阅读了适用于您的平台的应用程序二进制接口文档,您会发现这个描述很清楚。
我没有提到这一点,但是如果你将函数中的局部变量标记为static
,你仍然会做很糟糕的事情但是你可以通过一个指针在函数调用结束后可靠地继续访问该值因为该值不再在堆栈上分配。
最后,我刚看到你的最后一个问题。 dec
表示十进制。如果你将0x60e转换为十进制,你将获得1550。
<小时/> David关于堆栈对齐的更多信息,从他的评论中得出答案 - hagrawal。
对于访问元素和for的速度,需要堆栈对齐 呼叫的一致性。这样事情最好在记忆中对齐 快速访问和被叫功能并不需要&#34;奇怪&#34;哪里 事情会发生。这意味着通常会产生分配一个字节 在堆栈上分配2,4,8,16或甚至更多字节,全部 取决于对齐要求。