gpt4 book ai didi

c - 在 c 中释放 char 指针会导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:09:05 24 4
gpt4 key购买 nike

题中之意,将相关代码写在一个简单的文件中。

char* fn = NULL;
SDL_Log("fn pre address is: %p\n",fn);
fn = get_resource("test.txt");
SDL_Log("fn pos address is: %p\n",fn);
//free(fn); <--this causes seg fault if I uncomment it

INFO: fn pre address is: 0x0
INFO: fn pre address is: 0x7fa882501a00
INFO: fn pos address is: 0x7fa882501a00

get_resource(const char* filename) {
char* string = (char*)calloc(1, sizeof(strlen(res_dir) + strlen(filename)));
//i also tried with strncpy
//strncpy(string, res_dir, strlen(res_dir));
//strncpy(string + strlen(res_dir), filename, strlen(filename));

memcpy(string, "/usr/test/files", strlen(res_dir));
memcpy(string + strlen("/usr/test/files"), filename, strlen(filename));
string[strlen(filename) + strlen("/usr/test/files")] = '\0';
return string;
}

得到相同的行为。如果我释放分配的字符串,我将遇到段错误。而且它也不总是发生,这很奇怪。

最佳答案

char* string = (char*)calloc(1, sizeof(strlen(res_dir) + strlen(filename)));

这一行没有任何意义,sizeof 是一个运算符,用于确定类型 或表达式所需的存储大小某种类型。(*)

你想要的是这样的:

char* string = calloc(1, strlen(res_dir) + strlen(filename) + 1);

注意那里的 + 1,它为 c 风格字符串中的终止 0 字节保留空间。还要注意 void * 指针的转换(由 malloc() 和 C 中的 friend 返回)没有意义。它在 C++ 中是必需的,但在 C 中,void *通用指针类型并隐式转换为任何其他数据指针类型。

深入研究您的代码(根据 alk 的评论)...我猜 res_dir 只是 "/usr/test/files"?你可能在这里漏掉了一个斜杠(取决于你的文件名的内容)但是一般来说,对于连接字符串,已经有一个 C 语言的函数,在 string.h< 中声明。就写这么简单的东西:

char* string = calloc(1, strlen(res_dir) + strlen(filename) + 1);
strcpy(string, res_dir);
strcat(string, filename);

你就完成了。请注意,使用此方法甚至不需要 calloc()malloc() 就可以了。


(*) 在这里添加更多解释:您可能会看到 sizeof 经常用于内存分配,原因很明显。您想要的是为 char 类型保留内存。并且您需要一些 char 来适应这个内存。所以,正确的公式应该是这样的:

malloc( (strlen(res_dir) + strlen(filename) + 1) * sizeof(char) )

那为什么要省略 sizeof(char)?这是因为 char 的大小实际上被定义1x * 1 仍然是 x,所以这里不需要使用 sizeof :)

关于c - 在 c 中释放 char 指针会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331091/

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