在 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));
由于 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));