我正在尝试打印出一个字符数组,但是当我尝试打印出这些行时,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)
有谁知道如何解决这个问题?我感谢你的帮助!
答案 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);