繁体   English   中英

为什么不字符 newWord[45]; 在像 char newWord[45] = ""; 这样的函数开始时有“干净”的值; 做?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM