【问题标题】:Use of uninitialised value of size 8 from valgrind in c在 c 中使用来自 valgrind 的大小为 8 的未初始化值
【发布时间】:2021-01-27 12:40:02
【问题描述】:

由于 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 行用 cmets 突出显示;我尝试以多种方式实现这一点,但无法理解“未初始化”值的含义。

【问题讨论】:

  • 也许可以试试calloc(n, sizeof (type))
  • 删除这些***,它们会使您的代码无效。改为添加相关的 cmets。
  • “未初始化”值表示该值未初始化。
  • 您的// line27 评论实际上在第 28 行。

标签: arrays c memory dynamic valgrind


【解决方案1】:

在以下行中:

    Z = *(index + z);

至少一次,您正在从index 内存块中读取一个尚未分配值的值。 (顺便说一句,您可以使用Z = index[z] 以获得更清晰的代码。)因此,该“数组元素”的值将未初始化。

我不确定您想要/需要为该 index 数组分配什么初始值,但正如 cmets 中所建议的,您可以使用 calloc() function 在分配时将所有元素设置为零(请注意,malloc() function 创建了一个未初始化数据块。

所以,而不是:

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

使用:

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

【讨论】:

  • 上述行是否有浮点异常,(% 运算符且所有操作数均不为零)。
  • @Musical_Ant 如果Z 分配了垃圾值,那么将其用作seqList 的索引(或计算索引)可能会导致段错误或除以零异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多