use*_*950 0 c arrays segmentation-fault
主题说全部,这是用简单文件写的相关代码.
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;
}
Run Code Online (Sandbox Code Playgroud)
得到相同的行为.如果我释放分配的字符串,我将得到一个seg错误.它也不总是发生奇怪的事情.
小智 8
char* string = (char*)calloc(1, sizeof(strlen(res_dir) + strlen(filename)));
Run Code Online (Sandbox Code Playgroud)
这行没有任何意义,sizeof是用于确定某种类型或某种类型的表达式所需的存储大小的运算符.(*)
你想要的是:
char* string = calloc(1, strlen(res_dir) + strlen(filename) + 1);
Run Code Online (Sandbox Code Playgroud)
注意+ 1那里,它为0c样式字符串中的终止字节保留空间.另请注意,void *指针的投射(由malloc()C中的朋友和C中的朋友返回)没有意义.它在C++中是必需的,但在C中,void *是通用指针类型并隐式转换为任何其他数据指针类型.
进一步深入你的代码(根据alk的评论)......我想res_dir是的"/usr/test/files"?你可能在这里缺少一个斜杠(取决于你的内容filename),但一般来说,对于连接字符串,已经有一个C语言中的函数,声明在string.h.只要写一些简单的东西:
char* string = calloc(1, strlen(res_dir) + strlen(filename) + 1);
strcpy(string, res_dir);
strcat(string, filename);
Run Code Online (Sandbox Code Playgroud)
你完成了 注意你甚至不需要calloc()这种方法,malloc()会做得很好.
(*)在这里添加更多解释:sizeof出于显而易见的原因,您可能会看到经常使用内存分配.你想要的是保留类型的内存char.并且你想要一些chars 数适合这个记忆.所以,正确的公式将是这样的:
malloc( (strlen(res_dir) + strlen(filename) + 1) * sizeof(char) )
Run Code Online (Sandbox Code Playgroud)
那为什么要忽略sizeof(char)?那是因为a的大小char实际上被定义为1.x * 1还是x,所以不需要在sizeof这里使用:)