在 c 中使用来自 valgrind 的大小为 8 的未初始化值

Use of uninitialised value of size 8 from valgrind in c

由于 Valgrind 在错误摘要中给出了行号,我将提供完整代码:

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

int main(void)
{
int n = 0;
int q = 0;
int Z = 0;
scanf("%i %i", &n, &q);
fgetc(stdin);
int seqList[n][n];
int lastAnswer = 0;
char *queries[q];
int *index = malloc((sizeof(int) * n));          // Line 14
int *last = malloc(sizeof(int) * q);
int k = 0;
for (int i = 0; i < q; i++)
{
    queries[i] = malloc(sizeof(char) * 6);
    scanf("%[^\n]%*c", queries[i]);

    if (queries[i][0] == '1')
    {
        int x = queries[i][2] - '0';
        int y = queries[i][4] - '0';
        int z = (x ^ lastAnswer) % n;
        Z = *(index + z);
        seqList[z][Z] = y;                       // Line 27
        *(index + z) = Z + 1;
    }
    else if (queries[i][0] == '2')
    {
        int x = queries[i][2] - '0';
        int y = queries[i][4] - '0';
        int z = (x ^ lastAnswer) % n;
        Z = *(index + z);
        lastAnswer = seqList[z][y % Z]; //floating point exception
        last[k] = lastAnswer;
        k++;
    }
    free(queries[i]);
}
for (int i = 0; i < k; i++)
{
    printf("%i\n", last[i]);
}
free(last);
free(index);
}

当我 运行 程序时,在我的第二个输入中(在提供 n 和 q 的值之后),我收到此错误消息:

==9541== Use of uninitialised value of size 8
==9541==    at 0x4008FA: main (dynamic.c:27)
==9541==  Uninitialised value was created by a heap allocation
==9541==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind    /vgpreload_memcheck-amd64-linux.so)
==9541==    by 0x40080B: main (dynamic.c:14)
==9541== 

第27行和第14行用注释高亮显示;我尝试以多种方式实现它,但无法理解“未初始化”值的含义。

在以下行中:

    Z = *(index + z);

至少 一次从 index 内存块中读取一个值 尚未 有一个值分配给它。 (顺便说一下,您可以使用 Z = index[z] 来获得更清晰的代码。)因此,'array element' 的值将未初始化。

我不确定你 want/need 分配给那个 index 数组的初始值是什么,但是,正如评论中所建议的,你可以使用 calloc() function to set all elements to zero at the time of allocation (note that the malloc() function 创建一个块未初始化 数据)。

所以,而不是:

int* index = malloc((sizeof(int) * n));

使用:

int* index = calloc(n, sizeof(int));