以下代码中为什么以下分配的字符串(即result
)的大小不正确
#include <stdlib.h>
char *concat(const char *s1, const char *s2)
{
char *result;
result = malloc( strlen(s1) + strlen(s2) + 1 );
printf("%d", sizeof(result)); // <-- ????? ( it should be seven)
if ( result == NULL ){
printf("Error: malloc failed in concat\n");
exit(EXIT_FAILURE);
}
strcpy(result, s1);
strcpy(result, s2);
return result;
}
int main()
{
char *p;
p = concat("abc", "def");
return 0;
}
编辑: 我试图为新字符串分配足够的大小,但不知何时大小不正确。
答案 0 :(得分:3)
在这种情况下,sizeof
在编译时进行评估,并且不关注已分配块的大小。
表达式返回指针的大小,这对于硬件平台是固定的。
不幸的是,找不到malloc
返回的分配大小。如果您想知道已分配块的大小,则需要将大小存储在单独的变量中。
答案 1 :(得分:2)
sizeof(result)
会给出指针大小4
或8
,因此您无法使用它。
在调用malloc
后,您应该立即检查它的返回值,如果错误,则返回NULL
,如果该值不是NULL
则会指向未初始化的内容。
要获取字符串的长度,您需要strlen
函数,但如果内容未初始化,则将是未定义的行为。
在用数据填充缓冲区后需要使用strlen
,数据以'\0'
字节终止,该字节标记字符串的结尾,如果你没有,它就不会存在t初始化数据。