c中未初始化字符串的值是多少?

时间:2013-02-05 07:45:26

标签: c

  

可能重复:
  initial value of int array in C

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    char name[10];
    printf("%s\n", name);
    return 0;
}

C中未初始化的字符串有什么价值?编译器是否自动分配大小为10的存储并用垃圾值填充它?编写上述代码时基本上会发生什么?

6 个答案:

答案 0 :(得分:7)

在堆栈上分配了10个字节,这就是全部。它们的值保持不变,这意味着它在被分配之前就被写入了这10个字节。

答案 1 :(得分:3)

由于字符串未初始化,因此未定义值 - 它可能是任何值。我还会说打印未初始化的字符串是不安全的,因为它没有终止零字符,所以理论上你最终可能会打印超过10个字符。

另一件事 - C没有用任何东西填充存储空间。它只是让它保持原样。

编辑:请注意我并不是说只要你有一个0终止字符,就可以安全地访问未初始化的字符串。调用未定义的行为永远不会安全,因为未定义 - 您永远不会知道会发生什么。

答案 2 :(得分:1)

未初始化变量的内容是 - 除了例如在Java中 - 未定义。换句话说:内容由最近在堆栈上推送的值组成,用于其他方法调用。

答案 3 :(得分:1)

在您的特定示例中,它可能会为零。但这没关系。

关键是它是未定义。如果你不能相信它永远是相同的,那对你没用。你不能做任何假设。您的代码的其他任何部分都不能依赖它。它就像它不存在。

如果您对实际内容的来源感到好奇,它们是存储在堆栈中的先前执行上下文的剩余部分。如果你运行一些函数调用,你将会留下垃圾,你的程序可以随意覆盖。那些只有好的覆盖字节可能会在你的字符串中结束。

答案 4 :(得分:1)

C标准使用术语“未指定”,i。即它可以是任何东西。在现实生活中,它很可能会被随机垃圾填充,如果你运气不好,它将没有终止零字节,所以你调用未定义的行为,可能调用{{ 1}}会崩溃(分段错误,任何人?)。

答案 5 :(得分:0)

它包含垃圾(随机)值。请查看有关存储类的更多信息,以便更好地理解。