【问题标题】:Malloc adding one to initializing a char for string concat CMalloc 为字符串 concat C 初始化 char 加一
【发布时间】:2012-11-24 23:18:57
【问题描述】:

我在 stackoverflow 上找到了这个函数,它将两个字符串连接在一起。这是函数:

char* concatstring(char *s1,char *s2)
{
 char *result = malloc(strlen(s1)+strlen(s2)+1);
 strcpy(result,s1);
 strcat(result,s2);
 return result;
}

我的问题是,为什么我们在 malloc 调用中加 1?

【问题讨论】:

    标签: c malloc concatenation


    【解决方案1】:

    这是因为在 C 中,“字符串”存储为字符数组,后跟一个空字节。这是约定俗成的。因此,空字节可能不会出现在任何 C 字符串中。

    但是,实际的字符串本身不包含空字节(它只是字符串的表示的一部分),因此strlen 报告了非空字节的数量 个字节。要创建一个连接两个字符串的 C 字符串,您需要为空终止符留出空间。

    事实上,每一个字符串操作都需要以某种方式处理空终止符。不幸的是,细节因函数而异(例如,snprintf 做得对,但 strncpy 很危险),您应该非常仔细地阅读每个函数的手册,以了解谁负责处理空终止符以及如何处理。

    【讨论】:

      【解决方案2】:

      您需要为 C 中用于终止字符串的 '\0'(NULL 字符)分配空间。

      即字符串“cat”实际上是“cat\0”。

      【讨论】:

      • 相反,“"cat" 实际上是{ 'c', 'a', 't', 0 }。”
      【解决方案3】:

      如果字符串是“猫”:

      char * mystring = "cat";
      

      然后 strlen(mystring) 将返回 3。

      但实际上存储mystring需要4个字节,存储空字符需要1个字节。

      因此,如果您有两个字符串,“dog”和“cat”,它们的长度将为 3 和 3 ,尽管存储它们所需的字节数各为 4。存储它们的连接所需的内存为 3+3 +1 = 7。

      所以 malloc 中的 1 是分配额外的字节来存储空字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 2022-11-17
        • 2021-04-16
        • 1970-01-01
        相关资源
        最近更新 更多