[问题] 内存位址回传问题

楼主: Kuba4ma (哦吼)   2022-03-24 23:10:14
1.
char* GetMemory() {
char* p = (char *)malloc(100);
return p;
}
void test() {
char *str = NULL;
str = GetMemory();
strcpy(str, "hello world");
printf("%s\n", str);
}
int main(){
test();
}
2.
char* GetMemory() {
char p[] = "hello world";
return p;
}
void test() {
char *str = NULL;
str = GetMemory();
printf(str);
}
int main(){
test();
}
第一段的code会印出"hello world" 但是第二段不会
我的问题是
第二段code的GetMemory内做阵列宣告 不也是会配置内存给 p 吗?
那么做的事情和第一段code的GetMemory一样
为什么不会印出"hello world"
如果第二段code的p会因为function结束而不见的话
为什么第一段code的p不会消失
谢谢大家
作者: Schottky (顺风相送)   2022-03-25 00:19:00
置底十三诫之第五诫
作者: breeze08 (linuxer)   2022-03-25 00:23:00
第一段是把p内的值回传,然后p这个变量本身的空间(stack)被释放,而p回传值所指向的空间(heap)仍然存在
作者: ctrlbreak   2022-03-25 06:39:00
所以我都建议先学组语XD
楼主: Kuba4ma (哦吼)   2022-03-25 09:04:00
我理解了 谢谢各位大神
作者: Dracarys (MayShowGunMore)   2022-03-25 09:54:00
第一个p指向dynamically allocated的空间,第二段指向stack上的array。你应该是写C吧?那malloc就不用转型。https://godbolt.org/z/cbT74jcz6Clang会乖乖回传local variable的位址,gcc直接回传0。UB的情况code随便compiler生
作者: yesiah   2022-03-25 11:25:00
先读一下memory layout,弄懂什么东西在stack什么在heap
作者: CoNsTaR ((const *))   2022-03-29 06:39:00
C string literal 其实有和主程式一样的 lifetime所以 `p[]` 改 `*p` 或是直接回传 `"hello world"` 就可以了
作者: F04E (Fujitsu)   2022-03-29 08:57:00
.....

Links booklink

Contact Us: admin [ a t ] ucptt.com