2017-08-28 84 views
2

我是新来的c,并且被字符串结尾字符'\ 0'弄糊涂了,我应该分配它吗?我应该在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

是的,请。加上1. – pablo1977

+1

你想存储一个最大长度为6的字符串。你应该使用'char str [7]'。如果你使用char指针,你应该使用'char * str = malloc(7);'也'printf(“%s \ n”,as); //这problem' – BLUEPIXY

+1

记住,只是因为事情似乎工作,这并不意味着它是正确的。在你的例子中,'char as [3] =“abc”',可能会或可能不会是内存中'as'后面的零字节。 'printf'简单*假设*它有一个指向有效字符串的指针。行为是未定义的。 –

回答

3

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

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

而且编译器会自动计算需要的字节数。

malloc,必须加1例:

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

    return ret; 
} 
+0

如果我想写一个数字,我应该用6还是7? – Sato

+0

@Sato不要害怕尝试一个在线编译器:http://cpp.sh/9hhzp – stackptr

+0

@Sato你应该写7分配一个由6个字符组成的字符串的内存,因为你需要额外的一个字符来终止字符''\ 0'' –

0

您应该使用字符串长度+ 1,在你的情况,而在声明字符数组必须使用7。 由于printf()显示的未定义行为,您提供的示例可能会有效。

0

除了stackptr的回答是:

如果您计划覆盖你的数组:

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

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

的最大长度

在上述可能写入最多为29个字符长的串阵列的例子。

注意以下定义:所以你限制3个字符

char str[] = "abc"; 

...暗中创建4个字符长度的数组。