我的操作系统如何知道定义的变量是否已初始化?

问题描述 投票:0回答:2

目前我正在搞乱 C 中的排序算法。在此过程中我遇到了以下问题: 我已经定义了一个 int 数组

int array[LENGTH];

其中 LENGTH 是全局定义的变量。 然后我尝试更改数组的第一个元素。

array[0] = 1;

当使用 gcc 编译并执行时,我遇到了分段错误。使用 valgrind 执行二进制文件后,出现以下错误:

Conditional jump or move depends on uninitialised value(s)

当我再次运行 valgrind 时,现在使用标志

--track-origins=yes
,valgrind 引导我到达定义初始数组的确切行。

在堆上做同样的事情不会改变任何东西:

int* array = (int*) malloc(LENGTH*sizeof(int));
*(array+0) = 1;
...
free(array)

但是,我总是被告知我的操作系统不区分已初始化和未初始化的变量,而是简单地读取存储在分配的存储段中的任何垃圾,无论数组地址处的值(在堆栈上还是在堆)是否已设置。

现在我很困惑。我的系统如何识别某个位置的变量是否已初始化?或者我是否处于完全错误的路径上,并且堆栈上的存储和堆仅在初始化变量时分配(这可以解释很多)?

感谢您的帮助!

arrays c stack valgrind heap
2个回答
0
投票

我的系统如何识别某个位置的变量是否已初始化?

你是对的,操作系统没有。

然而,Valgrind 模拟由程序执行的机器代码(指令),并意识到您正在从以前从未编写过任何内容的内存地址读取某些内容(并且不属于在程序上自动初始化的程序段) start),所以它认为它读取未初始化的数据。

如果在检测到未初始化数据的读取后,Valgrind 遇到依赖于此类数据的指令,它将发出警告,例如您所看到的警告。


0
投票
我的系统如何识别某个位置的变量是否已初始化?

你的系统不知道。

Valgrind 知道您何时在其监督下运行程序,因为它会监视。这代价高昂,有时甚至非常昂贵。

或者我是否处于完全错误的路径上,堆栈上的存储和堆仅在初始化变量时分配(这可以解释很多)?

我不确定我明白你的意思。从语义上讲,当控制到达自动变量的声明时,就会为自动变量分配空间。在程序开始执行之前,为静态持续时间变量分配空间。当且仅当声明包含初始值设定项时,自动变量的空间在分配时才会

初始化

© www.soinside.com 2019 - 2024. All rights reserved.