![](/img/trans.png)
[英]Why does following C code print 45 in case of int 45 and 36 in case of STRING and ASCII value of CHAR?
[英]why doesn´t char newWord[45]; have "clean" values at the start of a function like char newWord[45] = ""; does?
我对这两个有点困惑。
我有一个名为 check 的函数,它执行以下操作:
bool check(const char *word)
{
char newWord[LENGTH + 1] = "";
for (int i = 0; word[i]; i++)
{
newWord[i] = tolower(word[i]);
}
}
现在,例如,如果我使用=""
,则无论何时运行函数check();
,变量newWord
都会将其所有值设为'\\0'
check();
但是当使用char newWord[LENGTH + 1];
即使在我的函数返回之后,该变量似乎仍保留旧值,因此当我再次执行check()
时, char newWord
已经具有我上次运行该函数时的值。
我知道这与指针和内存分配有关,但我似乎无法理解它是如何工作的。
运行check()
两次后找到的值仍然是垃圾值。 当您使用分配一些内存时
char newWord[LENGTH + 1];
你总是得到操作系统处理你的“一些”内存(用外行的话),最初是垃圾值。 您获得的内存块与之前调用check()
获得的内存块相同,这只是巧合。
但是,当您这样做时:
char newWord[LENGTH + 1] = "";
您正在将这些内存块显式初始化为\\0
。
这不是一个花哨的答案,但是编译器(和编译器的版本)对于是否在使用内存之前初始化内存有不同的看法。 除非最近事情发生了变化,唯一自动初始化的变量是具有静态范围的变量(全局变量和那些明确标记为static
变量)。
对于其他所有内容,某些编译器可能会将所有内容都设置为零(或其他用于调试的值),但大多数编译器不会为您的程序增加这么小的开销,因为您可能很快就会为自己分配一个值。 我职业生涯中最大的调试工作之一是因为我们将 C 编译器从一个不预初始化变量的编译器(像大多数一样)更改为一个预初始化变量的编译器,暴露了我的前辈没有发现的一堆错误(分配给错误的变量,寻找非零值并突然找到它们),因此这是一个需要了解的重要功能。
不过,您问题的关键是“似乎保持”,因为旧字符串仍处于正确位置只是偶然。 如果您在check()
调用之间调用另一个函数,您将开始看到不同的暂存内存。
故事的道德启示? 总是初始化你的每一个变量,除非你在使用它之前绝对知道它会得到一个值。
如果不初始化局部变量,它的值是不确定的。 这可以是任何东西,包括随机“垃圾”或自上次执行以来位于 RAM 内存中的剩余物。 无法保证您将获得什么价值 - 仅此而已。
在某些情况下,访问这样一个未初始化的变量的值也可能会调用未定义的行为:
(为什么)正在使用未初始化的变量未定义行为?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.