#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char name[10];
printf("%s\n", name);
return 0;
}
C中未初始化的字符串有什么价值?编译器是否自动分配大小为10的存储并用垃圾值填充它?编写上述代码时基本上会发生什么?
答案 0 :(得分:7)
在堆栈上分配了10个字节,这就是全部。它们的值保持不变,这意味着它在被分配之前就被写入了这10个字节。
答案 1 :(得分:3)
由于字符串未初始化,因此未定义值 - 它可能是任何值。我还会说打印未初始化的字符串是不安全的,因为它没有终止零字符,所以理论上你最终可能会打印超过10个字符。
另一件事 - C
没有用任何东西填充存储空间。它只是让它保持原样。
编辑:请注意我并不是说只要你有一个0终止字符,就可以安全地访问未初始化的字符串。调用未定义的行为永远不会安全,因为未定义 - 您永远不会知道会发生什么。
答案 2 :(得分:1)
未初始化变量的内容是 - 除了例如在Java中 - 未定义。换句话说:内容由最近在堆栈上推送的值组成,用于其他方法调用。
答案 3 :(得分:1)
在您的特定示例中,它可能会为零。但这没关系。
关键是它是未定义。如果你不能相信它永远是相同的,那对你没用。你不能做任何假设。您的代码的其他任何部分都不能依赖它。它就像它不存在。
如果您对实际内容的来源感到好奇,它们是存储在堆栈中的先前执行上下文的剩余部分。如果你运行一些函数调用,你将会留下垃圾,你的程序可以随意覆盖。那些只有好的覆盖字节可能会在你的字符串中结束。
答案 4 :(得分:1)
C标准使用术语“未指定”,i。即它可以是任何东西。在现实生活中,它很可能会被随机垃圾填充,如果你运气不好,它将没有终止零字节,所以你调用未定义的行为,可能调用{{ 1}}会崩溃(分段错误,任何人?)。
答案 5 :(得分:0)
它包含垃圾(随机)值。请查看有关存储类的更多信息,以便更好地理解。