在c中的两次执行之间有意地更改随机存储器位置

时间:2018-10-16 05:39:12

标签: c memory

有时我想告诉我的学生,局部变量必须在使用前进行初始化。但是在某些情况下,它们会在不初始化的情况下获得零初始值。所以我的学生不相信我。例如下面的代码。

#include <stdio.h>

int main(void){
     int sum;
     sum += 5;
     printf("%d", sum);
     return 0;
}

有时输出为5。为演示未将变量和初始化为零的不确定行为,我正在寻找一个示例。

4 个答案:

答案 0 :(得分:5)

指向标准是好的。但我了解您希望向学生展示榜样的愿望。我不确定最好的方法。但是为了增加出现未定义行为的机会,您可以声明编译器无法轻易优化的多个变量。

#include <stdio.h>
void main(){
    int sum1;
    int sum2;
    int sum3;
    int sum4;
    int sum5;
    int sum6;
    int sum7;
    int sum8;
    int sum9;
    int sum=sum1+sum2+sum3+sum4+sum5+sum6+sum7+sum8+sum9;
    printf("%d\n",sum);
}

在我的系统上;最近的Ubuntu,以及最近的GCC,每次运行都会产生不正确的结果,而您的原始示例始终会产生5。但是我不能为您的系统做任何保证。

答案 1 :(得分:3)

通常在启动进程时将内存初始化为零。否则,您将从另一个进程中获取旧的内存内容,这将带来安全风险。因此,以我的经验,这样的代码通常会打印零:

#include <stdio.h>

int main(void) {
    int x;
    printf("%d\n", x);
}

如果使用自己的进程使用的内存,则更有可能获得非零结果。例如,我刚用此程序得到非零的打印输出:

#include <stdio.h>

void f(void) {
    int x;
    printf("%d\n", x);
}

int main(void) {
    f();
    f();
    f();
}

但是请记住,根据标准,未初始化的局部变量(带有存储类auto)的内容是未定义的,因此允许编译器始终将其变量设置为零。或-4。

答案 2 :(得分:1)

如何显式设置某个位置的值并从另一个指向相同位置的未初始化变量中读取该值呢?

#include <stdio.h>

void foo()
{
    int x = 1234;
}

void bar()
{
    int y;
    printf("%d\n", y);
}

int main()
{
    foo();
    bar(); /* Will print out 1234 */
}

答案 3 :(得分:0)

最好不要自己向学生证明某些东西,而要使用C标准。

C99第6.7.8节初始化:

  

如果具有自动存储持续时间的对象未初始化   显然,它的值是不确定的。