我在stackoverflow上找到了这个函数,它将两个字符串连接在一起。这里是功能:Malloc添加一个初始化字符串concat的字符C
char* concatstring(char *s1,char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);
strcpy(result,s1);
strcat(result,s2);
return result;
}
我的问题是,为什么我们加1到malloc调用?
我在stackoverflow上找到了这个函数,它将两个字符串连接在一起。这里是功能:Malloc添加一个初始化字符串concat的字符C
char* concatstring(char *s1,char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);
strcpy(result,s1);
strcat(result,s2);
return result;
}
我的问题是,为什么我们加1到malloc调用?
您需要分配用于“\ 0”(NULL字符)空间,其用于终止字符串C.
即字符串“猫”,实际上是“猫\ 0”。
这是因为在C中“字符串”存储为字符数组,然后是空字节。这是惯例。因此,空字节可能不会出现在任何C字符串中。
然而,实际的字符串本身不包含空字节(这仅仅是表示字符串的的一部分),所以strlen
报告串中非空字节数。要创建连接两个字符串的结果的C字符串,您因此需要为空终止符留出空间。
其实,每字符串操作都需要用这种或那种方式处理空终止符。不幸的是,细节因功能而异(例如snprintf
做得不对,但strncpy
是危险地不同),并且您应该仔细阅读每个功能的手册以了解谁负责空终止符以及如何处理。
如果字符串为 “猫”:
char * mystring = "cat";
然后strlen的(MyString的),会返回3
但在现实中它需要4个字节存储的MyString,用一个字节存储空字符。所以如果你有两个字符串,“狗”和“猫”,它们的长度将是3和3,尽管存储它们所需的字节数将是4。存储其级联所需的内存将为3 + 3 +1 = 7.
因此,malloc中的1将分配额外的字节来存储空字符。
相反,“猫”实际上是'{'c','a','t',0}'。“ –