0

我有一个 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 characters\n");
        }
        if (counter==zeilen){
            zeilen +=10;
            stringList = (char**) realloc(stringList,size+10*sizeof(char));
            if (stringList == NULL){
                exit(EXIT_FAILURE);
            }
        }
        }
}

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

Valgrind 在第 1 行和第 5 行给了我一个 writeerror,在第 2 行也给了我一个 readerror。

4

3 回答 3

1

首先,您必须分配字符串缓冲区并验证其counter增加不超过max_strings

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

第 (1) 行应该是(strlen 而不是 sizeof):

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

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

strcpy(stringList[counter], input);
于 2013-05-16T13:01:11.017 回答
0

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

但是,如果你想保留你char**的,你需要改变一些事情:

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

  • 第二件事,您应该这样做以'\0'在您的末尾添加一个字符char*(以便稍后运行):

    stringList[counter] = (char *)malloc(strlen(input) + 1); // I add "+ 1"
    stringList[counter][strlen(input)] = '\0'; // 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"
    

    如果您不想遇到这个问题,您可以在代码的 malloc/realloc中的不同位置替换char*by *stringListcharby 。*(stringList[counter])sizeof

此外,在您的示例中未使用 laenge,全局变量也是不好的做法。

于 2013-05-16T14:49:23.983 回答
0

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

顺便提一句

这个

stringList[counter] = input;

应该改为

strcpy(stringList[counter], input);

否则分配内存

stringList[counter] = (char*) malloc(sizeof(input));

将毫无意义

于 2013-05-16T12:52:59.613 回答