打印出字符数组时,Valgrind无效读取大小为8

时间:2018-02-17 00:56:24

标签: c pointers valgrind

我正在尝试打印出一个字符数组,但是当我尝试打印出这些行时,valgrind会给出一条无效的读取消息。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
void printLines (char *ptArray[]);
char line1[] = "black yummy wolfberry";
char line2[] = "Nate is cute";
char line3[] = "hi there friend";
char line4[] = "abcd";

int main(int argc, char *argv[]){
  char **ptArray = calloc(4, sizeof(char *)); // Line 28 when calling calloc
  ptArray[0] = line1;
  ptArray[1] = line2;
  ptArray[2] = line3;
  ptArray[3] = line4;

  printLines(ptArray); // Line 34 when printLines is called

  free(ptArray);
  return 0;
}

void printLines (char *ptArray[]){
  char **a = ptArray;
  while(*a != NULL){   // Line 232 when invalid read occurs
    printf("%s\n", *a);
    a++;
  }
}  

以下是错误消息:

==12029== Invalid read of size 8
==12029==    at 0x40110C: printLines (textsort2.c:232)
==12029==    by 0x4008F2: main (textsort2.c:36)
==12029==  Address 0x5204060 is 0 bytes after a block of size 32 alloc'd
==12029==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12029==    by 0x400883: main (textsort2.c:28)

有谁知道如何解决这个问题?我感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

代码迭代超过4个已分配的指针,查找空指针

  while(*a != NULL){   // Line 232 when invalid read occurs
    printf("%s\n", *a);
    a++;
  }

代码应分配第5个并为其分配NULL

  // char **ptArray = calloc(4, sizeof(char *));
  char **ptArray = calloc(5, sizeof *ptArray);
  ptArray[0] = line1;
  ...
  ptArray[3] = line4;
  ptArray[4] = NULL;

替代,传递次数

void printLinesN(char *ptArray[], size_t count){
  for (size_t i = 0; i<count; i++) {
    printf("%s\n", ptArray[i]);
  }
}  

// Call example
// printLines(ptArray);
printLinesN(ptArray, 4);