请教一个c语言指针和编译方面的问题,见下图。请问最后输出结果为什么会是NULL指针??

#include

char *
GetStr(void){
char p[]="hello world";
return 0;
}

int
main(void){
char *str =NULL;
str=GetStr();
printf("%s\n",str);
return 0;
}

图片说明

3个回答

返回堆栈上的局部变量的指针,而堆栈在函数退出以后被销毁了。
还有,你程序里是return 0,下面的图是return p
你调试的程序和你的源代码对应么?

图片说明

看我这里的图,上面的mov是能将字符串指针(ebp-14h)放入eax的。
但是程序继续执行,是输出乱码,因为堆栈已经被覆盖了

第一个问题:
函数返回值是不对的,
char *GetStr(void); 这是你的函数原型。返回类型是char *指针,即所指向的地址空间。而你的函数返回类型却是int型。如:
char *GetStr(void){
char p[]="hello world";
return 0;  //肯定是为0  (NULL 其值也是0,使用#define 宏定义的)
}

问题二: 变量的生命周期以及作用域问题。
char *GetStr(void){
char p[]="hello world"; //p是一个指针,其作用域在该GetStr函数范围内,该函数运行结束,会自动释放该指针p所占的空间(指针本身也占用地址的);
return 0;  
}

基于以上2个原因;main中调用的结果是:null
其解决方案很多,比如下面:

 char *GetStr(void){
    char p[]="hello world";
    char *pTr = (char*)calloc(strlen(p)+1,sizeof(char));
    strncpy(pTr,p,strlen(p));
    return pTr;
}
int main(){
    char *str =NULL;
    str=GetStr();
    printf("%s\n",str);
    if(str)
    {
        free(str);
        str = NULL;
    }
    return 0;
}

若有帮助,还望点击“采纳!!!”谢谢。。。

第一个问题:
函数返回值是的,
char *GetStr(void); 这是你的函数原型。返回类型是char *指针,即所指向的地址空间。而你的函数返回类型却是int型。如:
char *GetStr(void){
char p[]="hello world";
return 0; //肯定是为0 (NULL 其值也是0,使用#define 宏定义的)
}

问题二:
char *GetStr(void){
char p[]="hello world"; //p是一个指针,其作用域在该GetStr函数范围内,该函数运行结束,会自动释放该指针p所占的空间(指针本身也占用地址的);
return 0;

}

基于以上2个原因;main中调用的结果是:null

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问