我完全是 C 语言的菜鸟,我需要一些帮助来理解为什么某段代码可以正确编译。
main(){
char name[3];
strcpy(name, "12345678912312");
printf("%s\n",name);
}
所以这段代码编译正确;但是,我不明白为什么它不会导致段错误。根据我对c的理解,每个字符都是1个字节。数组名称应该能够容纳 3 个字节,但实际上它可以容纳更多。这是为什么?
此外,如果我再添加一个字符,我将得到 Illegal Instruction(core dumped)。
main(){
char name[3];
strcpy(name, "123456789123121");
printf("%s\n",name);
}
然后,如果我向该代码添加另一个字符,它将抛出一个段错误(核心转储)错误。为什么错误不同?为什么以前没有发生过?
最后,我在哪里可以找到每个函数的文档?我来自 Java,所以我习惯于引用 Java 文档。
我在 Ubuntu linux 中使用 GCC 编译器。
最佳答案
这两个代码都会调用未定义的行为,因为您正在写入未分配的内存位置。在这种情况下,任何事情都可能发生。您的程序运行后可能会或可能不会提供预期的输出,否则它会崩溃或出现段错误。
另请注意,strcpy
不会检查数组绑定(bind),编译器也不会为此引发任何警告/错误。
关于c - 为什么这个编译没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317888/