Malloc在单独的函数中改变未初始化变量的行为?
这是我的Programming Langs Concepts / Implementation类的问题.给出以下C代码片段:
void foo() { int i; printf("%d ",i++); } void main() { int j; for (j = 1; j <= 10; j++) foo(); } foo中的局部变量i从不初始化,但在大多数系统上的行为与静态变量的行为类似.意味着程序将打印0 1 2 3 4 5 6 7 8 9.我理解为什么会这样做(我的内存位置永远不会改变)但是家庭作业中的问题要求修改代码(不改变foo)来改变这个行为.我提出了一个有效的解决方案,并使程序打印十个0但我不知道它是否是“正确”的解决方案,说实话我并不确切知道它为什么有效. 这是我的解决方案: void main() { int j; void* some_ptr = NULL; for (j = 1; j <= 10; j++) { some_ptr = malloc(sizeof(void*)); foo(); free(some_ptr); } } 我最初的思考过程是我没有改变位置,因为在foo的调用周围没有其他的内存操作,所以分配一个变量应该会破坏它,但是ince some_ptr在堆中分配,我在堆栈上,不应该some_ptr的分配对我没有影响?我的想法是,编译器正在玩一些优化该子程序调用的游戏,任何人都可以澄清吗? 解决方法
没有“正确”的解决方案.但是可以有一类适用于特定CPU架构,ABI,编译器和编译器选项的解决方案.
将代码更改为类似的内容将会以一种方式改变堆栈上方的内存,这种方式应该以有针对性的方式影响许多(如果不是大多数)环境. void foo() { int i; printf("%d ",i++); } void main() { int j; int a [2]; for (j = 1; j <= 10; j++) { foo(); a [-5] = j * 100; } } 输出(Linux上的gcc x64): 0 100 200 300 400 500 600 700 800 900 a [-5]是用于开销的堆栈字数和跨越这两个函数的变量.有返回地址,保存的堆栈链接值等.当foo()写入[-5]时,堆栈可能看起来像这样: i saved stack link return address main's j (must be something else) main's a[] 我在第二次尝试时猜到了-5. -4是我的第一个猜测. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |