在C中用方法定义数组

时间:2014-08-30 18:01:19

标签: c arrays

我是C的新手,我有一个问题,我在这里和谷歌搜索,但我没有得到答案。

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

我知道这是错的,但是

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

这是允许的。

有什么区别?编译器如何行动?

2 个答案:

答案 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.
}

将以不确定的方式工作,实际上并不鼓励,您现在可能会获得正确的结果,但将来如果您扩展代码我们无法保证。

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