【发布时间】: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