gpt4 book ai didi

c - 我是否必须在函数内分配返回的字符串?

转载 作者:行者123 更新时间:2023-11-30 19:48:31 24 4
gpt4 key购买 nike

以下程序将按预期在屏幕上打印“Hello\nWorld\n”('\n' = 向下行)。但实际上,据我所知,这里有些事情没有按应有的方式完成。 “hello”和“world”字符串是在函数内部定义的(因此是本地的,它们的内存在函数作用域结束时释放 - 对吗?)。实际上,我们并没有像我们应该的那样为它们执行 malloc(以保存作用域之后的内存)。那么当 a() 完成时,内存堆栈不是向上移动它的光标,并且“world”将被放置在内存中与“hello”相同的位置吗? (看起来这里没有发生这种情况,我不明白为什么,因此,如果实际上内存块被保存并且在作用域之后没有返回,为什么我通常需要执行此 malloc?)

谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *a()
{
char *str1 = "Hello";
return str1;
}

char *b()
{
char *str2 = "World";
return str2;
}

int main()
{
char *main_str1 = a();
char *main_str2 = b();
puts(main_str1);
puts(main_str2);
return 0;

}

编辑:所以你实际上所说的是,我的“hello”字符串在内存中占据一个恒定的位置,即使它在一个函数内部,如果我有它的地址,我可以从任何我想要的地方读取它(所以它的定义只是就像 malloc 但你不能释放它) - 对吗?

最佳答案

常量字符串不在堆栈上分配。仅在堆栈上分配指针。从 a()b() 返回的指针指向可执行内存的某个文字常量部分。 Another question dealing with this topic

关于c - 我是否必须在函数内分配返回的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com