在c中释放char指针会导致segfault

时间:2015-10-25 14:56:56

标签: c arrays segmentation-fault

主题说明所有,这里是用简单文件写的相关代码。

[5 8 4]

获得相同的行为。如果我释放分配的字符串,我将得到一个seg错误。而且它也不会发生任何奇怪的事情。

2 个答案:

答案 0 :(得分:8)

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中的朋友返回)并不合理。它在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);

你完成了。请注意,您甚至不需要calloc()这种方法,malloc()会很好。

(*)在这里添加更多解释:出于显而易见的原因,您可能会看到sizeof经常与内存分配一起使用。您想要的是为char类型保留内存。而且你想要一些char s的数量来适应这个记忆。所以,正确的公式就是:

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

那为什么要忽略sizeof(char)?这是因为char的大小实际上是定义的1x * 1仍为x,因此无需在此使用sizeof:)

答案 1 :(得分:2)

首先是这句话

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

不正确。表达

sizeof(strlen(res_dir) + strlen(filename))

相当于

sizeof( size_t )

并且可以等于4或8,具体取决于使用的环境。更多关于这个表达

sizeof(strlen(res_dir) + strlen(filename))

未评估。这就是函数strlen 在此表达式中不被称为

正确的陈述可能看起来像

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

考虑到您需要为终止零保留内存的帐户。

然而,即使这句话也不正确。:)

考虑一下你想做什么

memcpy(string, "/usr/test/files", strlen(res_dir));
memcpy(string + strlen("/usr/test/files"), filename, strlen(filename));

当您传递字符串"test.txt"时,您将获得

"/usr/test/filestest.txt"

我认为你的意思是以下

"/usr/test/files/test.txt"

如果是这样,那么内存分配必须看起来像

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

在这种情况下,你可以简单地写一下

strcpy( string, "/usr/test/files" );
strcat( string, "/" );
strcat( string, filename );

并在本案例中声明

string[strlen(filename) + strlen("/usr/test/files")] = '\0';
必须删除