我是C的新手,我有一个问题,我在这里和谷歌搜索,但我没有得到答案。
int main(){
char name[];
name = "PeerNet";
}
我知道这是错的,但是
char name[];
int main(){
scanf("%s", name); // I write PeerNet in scanf.
}
这是允许的。
有什么区别?编译器如何行动?
答案 0 :(得分:2)
初始化的工作方式与scanf
的工作方式不同。如果要将字符数组初始化为字符串,则必须在声明数组时正确执行此操作。然后,初始化将字符串文字中的字符复制到数组中。在任何其他时间都不允许将字符串文字分配给字符数组,因为只有在初始化时才会复制和填充数组进程。在任何其他时间,例如说:
name = "PeerNet";
编译器认为这是告诉指向字符数组的指针指向其他地方,这不应该发生 - 数组指针必须保持绑定到它自己的数组。
但是,即使在声明数组之后,scanf
也会遵循此复制和填充过程。所以声明如下:
scanf("%s", name);
scanf
会将输入字符串中的字符复制到名为name
的数组中。
答案 1 :(得分:0)
如果您没有初始化,请使用数组的索引号。你可以这样写:
int main(){
char name[8];
strcpy(name,"PeerNet");
}
或
int main(){
char *name;
name="PeerNet";
}
您正在执行的错误是,您尝试将char *类型分配给char类型,(name是char类型而“PeerNet”是char *类型),这是您无法做到的。
并且您不能将整个字符串分配给char类型,因为char类型是一个字节,字符串从第一个字符开始多于一个字节。因此,使用strcpy将该字符串分配给char类型数组。
还有一个你的代码都不会运行!即使你使你的角色数组全局化,你也应该给出索引号(加一个为null),如下所示:
char name[8];
int main(){
name="PeerNet";
}
当然这个
char name[];
int main(){
scanf("%s", name); // I write PeerNet in scanf.
}
将以不确定的方式工作,实际上并不鼓励,您现在可能会获得正确的结果,但将来如果您扩展代码我们无法保证。
您正在写入未分配的内存(超出阵列)。为了编译它,编译器至少分配了一个元素,然后你就开始编写了这个元素。