我应该在c中手动分配字符串结尾字符'\ 0'吗?

时间:2017-08-28 02:02:02

标签: c

我是c的新手,对字符串结尾字符'\ 0'感到困惑,我应该分配吗?

例如,我想存储一个最大长度为6的字符串;

如果我使用数组,我应该使用char str[6]还是char str[7]

  char as[3] = "abc";
  printf("%s\n", as);
  //seems no problem

如果我使用字符指针,我应该使用char *str = malloc(6)还是char *str = malloc(7)

3 个答案:

答案 0 :(得分:3)

对于预先初始化的数组,您不需要在括号中写入数字。你可以写

char str[] = "this is my string";

编译器将自动计算所需的字节数。

但对于malloc,您必须添加1. Ex:

char *strdup(const char *str)
{
    char *ret = malloc(strlen(str) + 1);
    strcpy(ret, str);

    return ret;
}

答案 1 :(得分:0)

您应该使用字符串长度+ 1.在您的情况下,您必须在声明char数组时使用7。 由于printf()显示的未定义行为,您提供的示例将起作用。

答案 2 :(得分:0)

除了stackptr的回答:

如果您打算覆盖您的阵列:

char str[30] = "abc";
...
strcpy(str, "Hello world"); /* This will overwrite the content of "str" */

...数组的长度必须是字符串的最大长度加1。

在上面的示例中,您可以将最多29个字符长度的字符串写入数组。

请注意以下定义:

char str[] = "abc";

...隐式创建一个长度为4个字符的数组,因此限制为3个字符。