请问下函数里面的指针变量是定义在堆空间还是栈空间

yangmo 发布于 2010/12/15 10:54
阅读 1K+
收藏 2

char *mytest(){

char *str="qwer";

return str;

}

char *mytest1(){

char *str="qwer";

return str;

}

int main(void) {

char *ret;

        char *ret1;

ret = mytest();

        ret1=mytest1();

printf("ret=%s--------ret1=%s",ret,ret1);

return 1;

}

为什么一个能打印,一个却不能打印,区别在那点啊?大哥大姐些,帮帮忙啊,谢谢了

加载中
0
Lunar_Lin
Lunar_Lin

你确定你发的贴 没问题?

    ......

 函数 变量定义在栈空间上. 但是返回值会复制. 应该不是问题. 

0
pizigou
pizigou

1、测试了,两个都能取到值(环境:cygwin gcc 3.4.4),只不过这个返回值是常量指针不能改写。

2、指针变量是变量,变量的的生存周期跟其他变量规则没什么区别。而所指向的是地址,则有在堆和栈的区别,在堆上的是需要主动申请与释放,栈上的是受生存周期影响。

0
y
yangmo

引用来自#2楼“夜游神”的帖子

你确定你发的贴 没问题?

    ......

 函数 变量定义在栈空间上. 但是返回值会复制. 应该不是问题. 

我检查了,确实是我写错了,感谢啊  mytest1这个函数应该是

char *mytest1(){

 

char str[]="qwer";

return str;

}

0
y
yangmo

引用来自#4楼“zeussam”的帖子

1、测试了,两个都能取到值(环境:cygwin gcc 3.4.4),只不过这个返回值是常量指针不能改写。

2、指针变量是变量,变量的的生存周期跟其他变量规则没什么区别。而所指向的是地址,则有在堆和栈的区别,在堆上的是需要主动申请与释放,栈上的是受生存周期影响。

谢谢你啊,我代码搞错了,mytest1这个函数应该是

char *mytest1(){

char str[]="qwer";

return str;

}

好象返回的不是常量指针,该指针是可以从新被赋值的

0
魏士超

return不要返回指向栈内存指针或者引用,因为该内存在函 数体结束时被自动销毁。

第一个str指向内存常量区,第二个str指向str数组,数组在调用函数结束后,数组内存消失,返回的值找不到数组了,故出现乱码,第一个由于指向常量区,故不会出现乱码。

返回顶部
顶部