gpt4 book ai didi

c - 为字符串动态分配内存

转载 作者:太空狗 更新时间:2023-10-29 15:25:34 26 4
gpt4 key购买 nike

char* test() {
char* returnValue = "test";
return returnValue;
}
char* test=test();
printf("%s",test);

使用安全吗?是不是一样,因为

char* test {
char* returnValue=strdup("test");
return returnValue;
}
char* test=test();
printf("%s",test);

如果是,那么我应该稍后释放它吗?它们似乎都能正常工作。

最佳答案

is it the same

不,不是。


char * test1() {
char * returnValue = "test";
return returnValue;
}

以上代码将固定地址返回给常量 文字"test"。这将是每次调用该函数时的相同地址。

不是内存的动态分配

printf("%d\n", test1() == test1());

将打印

1

意思是“真”,返回的两个地址是一样的。

关于“常量

为了更好地反射(reflect) test1() 结果的常量性,最好定义如下:

const char * test1() {
const char * returnValue = "test";
return returnValue;
}

char * test2 {
char * returnValue = strdup("test");
return returnValue;
}

上面的代码将地址返回到一个新分配的内存区域,该区域已被复制到“test”中。每次调用该函数时,这将是一个不同*1 地址。

*1:至少“不同”,只要之前调用test2() 的结果不是free() 已经

内存的动态分配。因此,它需要调用 free() 并传入 strdup() 返回的地址。 (在内部调用 malloc() )释放内存,如果不再需要的话。

printf("%d\n", test2() == test2()); /* leaks memory: 2 times 4+1 char */

将打印

0

意思是“false”,返回的两个地址是不同的。

为了完整性:按照上面的代码片段避免泄漏

char * p, * q;
printf("%d\n", (p = test2()) == (q = test2()));
free(p);
free(q);

is it saft to use

两个片段的代码形式上都是正确的。

使用哪个以及是否使用“安全”完全取决于用例和上下文。

关于c - 为字符串动态分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48126119/

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