malloc on char **读写错误

时间:2013-05-16 12:50:58

标签: c malloc

我有一个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行给了我一个写错误,也是第2行的读者。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

BTW

stringList[counter] = input;

应改为

strcpy(stringList[counter], input);

否则用

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

毫无意义

答案 2 :(得分: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"
    

    如果你不想解决这个问题,可以用小提示替换char* <{1}}和*stringList char位于代码的malloc / realloc内的不同*(stringList[counter])内。

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