[英]difference between character array initialized with string literal and one using strcpy
請幫助我了解使用諸如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;
}
你錯了。 這兩個代碼段的結果
char line[80] = "1:2";
和
char line[80];
strcpy( line, "1:2" );
是一樣的 那就是這句話
char line[80] = "1:2";
確實有效。:)只有一個區別。 當使用字符串文字初始化數組時,所有不具有字符串文字相應初始化字符的數組元素都將以'\\0'
進行初始化,即它們將被零初始化。 當使用函數strcpy
時,未被字符串文字的字符覆蓋的數組元素將具有未確定的值。
數組由字符串文字(除了其“ tail”的零初始化除外)初始化,就像應用了函數strcpy
。
這些語句之間存在精確的結果等價關系
char line[80] = "1:2";
和
char line[80];
strncpy( line, "1:2", sizeof( line ) );
也就是說,當您使用函數strncpy
並指定目標數組的大小時。
如果您是要傳遞給函數直接將字符串文字tokenize
為函數的參數,則該程序具有未定義的行為,因為您不能更改字符串文字。
根據C標准(6.4.5字符串文字)
7不確定這些數組是否是唯一的,只要它們的元素具有適當的值即可。 如果程序嘗試修改這樣的數組,則行為是不確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.