C语言 malloc on char**读写错误



我有一个char** stringList,我想在其中写入未知大小和计数的字符串。

在某个地方,我有以下代码:

static char** stringList;
static int laenge=0;
static int size=0;
void getInput(){
    char input[FILENAME_MAX];
    int zeilen=10;
    int counter=0;
    stringList = (char**) malloc(zeilen*sizeof(char*));
    size = zeilen*sizeof(char*);
        while(fgets(input, FILENAME_MAX , stdin) != NULL)
        {
        if (strlen(input) <= 100){
            stringList[counter] = (char*) malloc(strlen(input));
            size += strlen(input);
            if (stringList[counter] == NULL){
                exit(EXIT_FAILURE);
            }
            strcpy(stringList[counter],input);
            counter++;
            laenge++;
        } else {
            fprintf(stderr,"String longer than 100 charactersn");
        }
        if (counter==zeilen){
            zeilen +=10;
            stringList = (char**) realloc(stringList,size+10*sizeof(char));
            if (stringList == NULL){
                exit(EXIT_FAILURE);
            }
        }
        }
}

如果需要,我增加stringList的大小,使它能够存储更多的字符串。

Valgrind在第1行和第5行显示写错误,在第2行显示读错误。

首先,您必须分配字符串缓冲区并验证counter的增长不会超过max_strings:

char** stringList = (char**)malloc(max_strings*sizeof(char*));

第一行应为(strlen而不是sizeof):

stringList[counter] = (char*) malloc(1+strlen(input));

第(5)行应该是(您必须将字符串复制到分配的内存中):

strcpy(stringList[counter], input);

如果您想为char **stringList分配更多内存,您可以使用realloc()

stringList[counter] = input;

改为

strcpy(stringList[counter], input);

,否则用

分配内存
stringList[counter] = (char*) malloc(sizeof(input));

没有意义

首先,如果你想要一个数组来存储一个不确定数量的元素(在这种情况下是char*),你应该使用链表(网上有很多教程和代码示例),而不是一个简单的char**,因为无用的使用realloc是一个不好的做法(内部realloc分配一个新的缓冲区,然后从旧缓冲区复制一切到新的)。

然而,如果你想保持你的char**有一些事情你需要改变:

  • 首先,您应该在第一次调用malloc时检查它的返回值

  • 第二件事,你应该这样做,在你的char*的末尾添加一个''字符(为了以后运行它):

    stringList[counter] = (char *)malloc(strlen(input) + 1); // I add "+ 1"
    stringList[counter][strlen(input)] = ''; // 0 works also
    
  • 第三件事,你应该删除size变量,因为它是无用的

  • 第四件事,在if (counter==zeilen)块中,第二行应该是:

    stringList = (char**) realloc(stringList,zeilen*sizeof(char*)); // I replaced char by char * and used zeilen instead of "size+10"
    

    如果你不想有这个问题,你可以把char*替换为*stringListchar*(stringList[counter])在不同的sizeof内malloc/realloc的代码

此外,在你的例子中没有使用全局变量也是不好的做法。

相关内容

  • 没有找到相关文章

最新更新