加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Malloc在单独的函数中改变未初始化变量的行为?

发布时间:2020-12-16 10:02:17 所属栏目:百科 来源:网络整理
导读:这是我的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从不初始化,但在大多数系统上的行为与静态变量的行
这是我的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是我的第一个猜测.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读