用字符串文字初始化的字符数组和用strcpy初始化的字符数组之间的区别

时间:2014-12-03 05:25:01

标签: c pointers token c-strings

请帮助我了解使用char line[80]="1:2"等初始化字符数组(不起作用!!)和使用char line[80]后跟strcpy(line,"1:2")的字符数组的区别。
根据我在第一种情况下的理解,我有一个charachter数组,它已被分配内存,我正在复制一个字符串文字。在第二种情况下也是如此。但显然我错了。所以我的理解有什么不妥。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void tokenize(char* line)
{
   char* cmd = strtok(line,":");

    while (cmd != NULL)
    {
    printf ("%s\n",cmd);
    cmd = strtok(NULL, ":");
    } 
}

int main(){
char line[80]; //char line[80]="1:2" won't work 
/*
char *line;
line = malloc(80*sizeof(char));
strcpy(line,"1:2");
*/
strcpy(line,"1:2");
tokenize(line);
return 0;
}

1 个答案:

答案 0 :(得分:3)

你错了。这两个代码片段的结果

char line[80] = "1:2";

char line[80];
strcpy( line, "1:2" );

是一样的。这就是这句话

char line[80] = "1:2";

确实有用。:) 只有一个区别。当数组由字符串文字初始化时,不会有字符串文字的相应初始化字符的数组的所有元素将由'\0'初始化,即它们将被零初始化。当使用函数strcpy时,未被字符串文字字符覆盖的数组元素将具有未终止的值。

数组由字符串文字初始化(除了&#34; tail&#34;的零初始化除外),就像应用函数strcpy一样。

这些陈述之间存在结果的确切等价

char line[80] = "1:2";

char line[80];
strncpy( line, "1:2", sizeof( line ) );

当您使用函数strncpy并指定目标数组的大小时。

如果你的意思是直接将函数tokenize作为函数的参数传递给函数{{1}},那么程序会有未定义的行为,因为你可能不会改变字符串文字。

根据C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

相关问题