5

可能重复:
C 中 int 数组的初始值

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

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

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

4

6 回答 6

8

在堆栈上分配了 10 个字节,仅此而已。它们的值保持原样,这意味着它是在分配之前写入这 10 个字节的内容。

于 2013-02-05T07:46:38.033 回答
3

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

还有一件事 -C不会用任何东西填满存储空间。它只是让它保持原样。

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

于 2013-02-05T07:47:04.587 回答
1

未初始化变量的内容是未定义的(例如在 Java 中除外)。换句话说:内容由最近压入堆栈以供其他方法调用的值组成。

于 2013-02-05T07:46:56.160 回答
1

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

关键是它是undefined。如果你不能相信它总是一样的,它对你没有用。你不能做任何假设。您的代码的任何其他部分都不能依赖它。就好像它不存在一样。

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

于 2013-02-05T07:49:11.210 回答
1

C 标准使用术语“未指定”,即它可以是任何东西。在现实生活中,它很可能会充满随机垃圾,如果你不走运,它不会有一个终止的零字节,所以你调用未定义的行为并且可能调用printf()会崩溃(分段错误,有人吗?) .

于 2013-02-05T07:49:26.850 回答
1

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

于 2013-02-05T08:06:54.000 回答