gpt4 book ai didi

c - 为什么 c 字符串被释放?

转载 作者:行者123 更新时间:2023-12-02 08:50:33 25 4
gpt4 key购买 nike

不熟悉C,有错误请指正。

这是一些代码:

void db_cstr(char* cstr, int len) {
char* temp2 = cstr;
cstr = (char*)malloc(len*2*sizeof(char));
// print 1
printf(cstr);
printf("\n");
//print 2
printf(temp2);
printf("\n");
strcpy(cstr, temp2);
//free
free(temp2);
//print 3
printf(cstr);
}
int somefunction(){
int array_len = 10;
char* cmd = (char*)malloc(array_len*sizeof(char));
strcpy(cmd, "apple");
db_cstr(cmd, array_len);
// final print
printf(cmd);
return 1;
}

我的值(始终)为//print 1 == ""and//print 2 == "apple"and//print 3 == "apple"。但是,当我进行最终打印时,printf 什么也不打印。我认为这与 free(temp2); 有关所以当我把它注释掉时,最后的打印品是“苹果”。我相信这是因为 somefunction 中的原始 cmd 指针仍然指向 temp2 中的已释放数组。如何使 cmd 指针指向新的 cstr 在 db_cstr 中指向的内容。 (我不希望 db_cstr 返回任何东西)。

最佳答案

以下 free()s 调用者的 cmd:

char* temp2 = cstr;
free(temp2);

因此最后的 printf() 试图打印已经释放的内存,这是未定义的行为。

db_cstr() 返回新指针的最简单方法如下:

char* void db_cstr(char* cstr, int len) {
...
printf(cstr);
return cstr;
}

int somefunction(){
...
cmd = db_cstr(cmd, array_len);
...
}

通过将 db_cstr() 的第一个参数变成指向指针的指针 (char**) 并适当更改代码,可以实现类似的效果。

关于c - 为什么 c 字符串被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8835753/

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