主题说明所有,这里是用简单文件写的相关代码。
[5 8 4]
获得相同的行为。如果我释放分配的字符串,我将得到一个seg错误。而且它也不会发生任何奇怪的事情。
答案 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
的大小实际上是定义的是1
。 x * 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';
必须删除。