我有一个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行的读者。
答案 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不是用在你的例子中,而全局变量也是不好的做法。