2014-02-16 90 views
0
void foo (char *input) { 
    char *myVar; 
    *myVar = *input; 
} 

我明白,如果我分配使用malloc(sizeof(char)myVar内存它将指向,但如果我不分配内存,当我尊重它,如何编译器处理内存分配?将它分配在堆栈堆堆函数内部的指针变量指向堆栈或堆?

+5

在取消引用指针时不涉及内存分配。所以你的代码只是展现*未定义的行为*。 –

+2

但是,在分配给此代码段中的取消引用的*不确定*指针时,存在一个很好的**未定义行为**。 – WhozCraig

+3

在你的代码中* * myVar = * input;'调用未定义的行为,btw同时'myVar','input'存储在堆栈上 –

回答

2
时,我尊重它

,编译器如何处理内存分配

反引用指针的值(地址)不分配内存。 解引用只是让你访问内存的引用,就是指针指向的地方。

从哪里分配这个内存(如果有的话)取决于指针的什么东西。 LS。

注意:解引用未初始化的指针会引发未定义的行为,就像它对任何读取未加初始化的内存/变量所做的操作一样。

+0

是否意味着它在典型的嵌入式系统中指向.BSS(未初始化的数据段)? – Chen

+0

@陈:它可以指向任何地方。在C语言中,除了声明'static'的变量外,还有** no **默认初始化,默认为'0'。 – alk

4

变量myVar位于堆栈上(对于在堆栈中存储局部变量的编译器),但它不指向任何位置。这意味着当您解除引用时,您有未定义的行为

技术上,myVar的值将是不确定的(即看起来是随机的),因此它将指向一个随机位置。这意味着解除引用有时会导致崩溃,而其他时间可能不会。

+1

我不会称之为随机的。然后有人来了,想用未分配的内存作为PRNG ......(没有找到问题,但有一个这样的......) – glglgl

+1

@glglgl:你的意思就像臭名昭着的[Debian OpenSSL implementation](http: //msmvps.com/blogs/alunj/archive/2008/05/15/1623193.aspx)? –

+0

@glglgl这就是为什么我说*看似*随机。 –