我是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)
?
答案 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个字符。