void foo (char *input) {
char *myVar;
*myVar = *input;
}
我明白,如果我分配使用malloc(sizeof(char)
myVar
内存它将指向堆,但如果我不分配内存,当我尊重它,如何编译器处理内存分配?将它分配在堆栈或堆堆?函数内部的指针变量指向堆栈或堆?
void foo (char *input) {
char *myVar;
*myVar = *input;
}
我明白,如果我分配使用malloc(sizeof(char)
myVar
内存它将指向堆,但如果我不分配内存,当我尊重它,如何编译器处理内存分配?将它分配在堆栈或堆堆?函数内部的指针变量指向堆栈或堆?
变量myVar
位于堆栈上(对于在堆栈中存储局部变量的编译器),但它不指向任何位置。这意味着当您解除引用时,您有未定义的行为。
技术上,myVar
的值将是不确定的(即看起来是随机的),因此它将指向一个随机位置。这意味着解除引用有时会导致崩溃,而其他时间可能不会。
我不会称之为随机的。然后有人来了,想用未分配的内存作为PRNG ......(没有找到问题,但有一个这样的......) – glglgl
@glglgl:你的意思就像臭名昭着的[Debian OpenSSL implementation](http: //msmvps.com/blogs/alunj/archive/2008/05/15/1623193.aspx)? –
@glglgl这就是为什么我说*看似*随机。 –
在取消引用指针时不涉及内存分配。所以你的代码只是展现*未定义的行为*。 –
但是,在分配给此代码段中的取消引用的*不确定*指针时,存在一个很好的**未定义行为**。 – WhozCraig
在你的代码中* * myVar = * input;'调用未定义的行为,btw同时'myVar','input'存储在堆栈上 –