2015-11-29 35 views
0

我使用valgrind通过选项track-origins=yes来调试我的代码,并发现此错误。未初始化的值是通过堆栈分配创建的 - valgrind

$ valgrind --track-origins=yes ./frgtnlng <in> out 
==7098== 
==7098== Conditional jump or move depends on uninitialised value(s) 
==7098== at 0x4C2F1BC: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==7098== by 0x400857: main (frgtnlng.c:24) 
==7098== Uninitialised value was created by a stack allocation 
==7098== at 0x40064C: main (frgtnlng.c:9) 
==7098== 
==7098== Conditional jump or move depends on uninitialised value(s) 
==7098== at 0x40085A: main (frgtnlng.c:24) 
==7098== Uninitialised value was created by a stack allocation 
==7098== at 0x40064C: main (frgtnlng.c:9) 

9号线:

scanf("%d", &t); 

我不明白这到底是怎么造成的问题。

frgtnlng.c:

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    int t, n, k, l, i, j, z, out[100]; 
    char f[5][100], m[5][50][50]; 

    scanf("%d", &t); 
    while (t--) { 
     for (i = 0; i < 100; i++) 
      out[i] = 0; 
     scanf("%d%d", &n, &k); 
     for (i = 0; i < n; i++) 
      scanf("%s", f[i]); 
     for (i = 0; i < k; i++) { 
      scanf("%d", &l); 
      for (j = 0; j < l; j++) 
       scanf("%s", m[i][j]); 
     } 
     for (i = 0; i < k; i++) 
      for (j = 0; j < l; j++) 
       for (z = 0; z < n; z++) { 
        if (strcmp(m[i][j], f[z]) == 0) 
         out[z] = 1; 
       } 
     for (i = 0; i < n; i++) { 
      if (out[i]) 
       printf("YES "); 
      else 
       printf("NO "); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 

在:

2 
3 2 
piygu ezyfo rzotm 
1 piygu 
6 tefwz tefwz piygu ezyfo tefwz piygu 
4 1 
kssdy tjzhy ljzym kegqz 
4 kegqz kegqz kegqz vxvyj 

回答

7

的valgrind的行号是关闭的:它应该报道7,而不是9,用于分配行号。错误行24,但是,是正确的 - 问题就在这里:

if (strcmp(m[i][j], f[z]) == 0) 

的问题是,j循环从0到l-1,包容性,但l是什么它已经在最后迭代被设置为读取二维数组的循环,也就是4。这就是为什么每次涉及到数组中的行数少于4的条目时,它从数组的未初始化部分读取。

修复的方法是存储各行的长度分别通过使l阵列l[5],以及使用在l[i]两个环路:

for (i = 0; i < k; i++) { 
    scanf("%d", &l[i]); 
    for (j = 0; j < l[i]; j++) 
     scanf("%s", m[i][j]); 
} 
for (i = 0; i < k; i++) 
    for (j = 0; j < l[i]; j++) 
     for (z = 0; z < n; z++) { 
      if (strcmp(m[i][j], f[z]) == 0) 
       out[z] = 1; 
     } 
+1

包? 'j'从0到'l'独占,因为它小于,不小于或等于。间隔是[0,1)。 – this