2014-08-30 28 views
1

我是C新手,我有一个问题,我在这里搜索和谷歌,但我没有得到答案。用C中的方法定义一个数组

int main(){ 
char name[]; 
name = "PeerNet"; 
} 

这是不对的,但我知道

char name[]; 
int main(){ 
scanf("%s", name); // I write PeerNet in scanf. 
} 

这是允许的。

有什么区别?编译器如何操作?

+1

这两个变体都不使用gcc编译。你错过了什么吗? – hennes 2014-08-30 18:04:56

+0

你是如何编译这个的?请发布您的命令 – 2014-08-30 18:05:43

+1

FWIW,Clang编译第二个(减去赋值),并带有一个警告,假设它有一个元素。 – chris 2014-08-30 18:08:20

回答

2

这与初始化的工作方式和scanf的不同之处有所不同。当你想将一个字符数组初始化为一个字符串时,你必须在声明该数组时正确地做到这一点。初始化然后将字符串中的字符复制到数组中。任何其他时间都不允许将字符串文字分配给字符数组,因为这种复制和填充数组过程仅在初始化时发生。在其他任何时间,如说:

name = "PeerNet"; 

编译器认为这是告诉指针字符数组指向其它地方,这不应该发生 - 该数组指针有保持结合自身的阵列。

但是,即使在声明数组之后,scanf也会遵循此复制和填充过程。因此,与像声明:

scanf("%s", name); 

scanf将输入的字符串中的字符复制到名为name数组。

+3

出于兴趣,什么是当'scanf'将值复制到第二个变量中时,数组的大小? – hennes 2014-08-30 18:46:05

0

如果您未初始化,请使用数组的索引号。你可以这样写:

int main(){ 
char name[8]; 
strcpy(name,"PeerNet"); 
} 

int main(){ 
char *name; 
name="PeerNet"; 
} 

你正在做的是,你想分配一个char *类型char类型的错误,(名字是char型和“PeerNet”是一个char *类型),你不能这样做。

而且不能将整个字符串分配给char类型,因为char类型是一个字节,而字符串从第一个字符开始多于一个字节。因此,使用strcpy将该字符串分配给您的char类型数组。

还有一个你的代码都不会运行!即使你让你的字符数组全局的,你应该给指数(加上一个零),如下:

char name[8]; 
int main(){ 
    name="PeerNet"; 
    } 

当然,这

char name[]; 
int main(){ 
scanf("%s", name); // I write PeerNet in scanf. 
} 

工作,但未定义的方式,其实这不是鼓励,你现在可能会得到正确的结果,但将来如果你扩展代码,我们不能保证。

您正在写未分配的内存(超出数组)。为了编译这个,编译器至少分配了一个元素,然后你就写出了这个元素。

+0

我没有提到char,我写了char数组。正如你所看到的,我可以将整个字符串分配给char数组。我为什么要给一个号码?据我所知,它可以自动调整大小。 – PeerNet 2014-08-30 19:14:32

+0

我用字符,因为你的字符串中的每个字母是一个字符右?不,你不能像你这样分配它,你可以这样做:char name [] =“PeerNet”;对不起,如果你喜欢你所做的,它不能自己调整大小,只有在你的代码的同一行中声明并初始化时,它才能调整大小! – jeevan 2014-08-30 19:18:11

+0

哈,你在开玩笑吗?如果你在谈论我的第一个代码,我强调“这是我错的错”。如果你正在谈论第二个代码,它的工作原理!我可以打印数组的长度因此它可以自己调整大小! – PeerNet 2014-08-30 19:28:19

相关问题