我有一个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*
替换为*stringList
和char
由*(stringList[counter])
在不同的sizeof
内malloc/realloc的代码
此外,在你的例子中没有使用全局变量也是不好的做法。