Realloc在while循环中不起作用

时间:2015-05-21 04:55:44

标签: c memory-leaks realloc

我的C任务需要帮助。任务是编写一个程序,它接受未知长度的字符串输入。我还需要分开单词,这就是我使用char**的原因。当出现特殊字时,程序停止输入。你可以看到我的代码:

char **words=NULL;
 maxWords=1;
numberOfWords=0;
words=calloc(maxWords,sizeof(char **));
input=malloc(max*sizeof(char  *));

words[numberOfWords]=calloc(max,sizeof(char*));


while(stopValue){
    while((c=getchar())!='\n' && c!=' ' && c!=EOF){
        input[i++]=c;

        if(i==currentSize){
            currentSize=i+max;
            input=realloc(input,currentSize);
            words[numberOfWords]=realloc(words[numberOfWords],currentSize);
        }
    }
    input[i]='\0';
    if(strcmp(input,terminator)==0){
        break;
    }
    strcpy( words[numberOfWords],input);

    numberOfWords++;
    maxWords++;

    words=realloc(words,maxWords);
    words[numberOfWords]=calloc(max,sizeof(char*));
    currentSize=max;
    i=0;
    input=realloc(input,max);
 }

当我只输入2-3个单词时,效果很好。但是当有更多时,它会失败。我认为问题在于words=realloc(words,maxWords);这一行,但我不知道到底是什么。

请帮忙吗?

1 个答案:

答案 0 :(得分:4)

calloc()的第二个参数应该是指针指向的大小,即指向类型,而不是指针类型本身的大小。

例如,假设您要为10 int分配空间,将结果分配给int *p,以下任何一种都是正确的语法并展示已定义的行为:

int *a = malloc(10 * sizeof(int));
int *b = calloc(10, sizeof(int));
int *c = realloc(NULL, 10*sizeof(int))
int *d = malloc(10 * sizeof *d);
int *e = calloc(10, sizeof *e);
int *f = realloc(NULL, 10 * sizeof *f);

指向指针的行为没有区别。如果要分配一个指向char的指针序列,则应用相同的语法:

char **a = malloc(10 * sizeof(char*));
char **b = calloc(10, sizeof(char*));
char **c = realloc(NULL, 10*sizeof(char*))
char **d = malloc(10 * sizeof *d);
char **e = calloc(10, sizeof *e);
char **f = realloc(NULL, 10 * sizeof *f);

请注意,不仅是语法,而且上述两个列表中最后三个的实际代码都是相同的,除了指针类型本身(第一个是指向int的指针,第二个指向指向指向char的指针。该语法利用sizeof运算符(它不是函数或宏函数;它是运算符)如何用于变量而不是

那就是说,代码中的words是一个指向char的指针。我应该使用类似的语法分配适当的大小。以下任何一种都可以正常工作:

char **words = calloc(maxwords, sizeof(char*)); // right, uses specific type
char **words = calloc(maxwords, sizeof *words); // right, gets size from var type

两者都做同样的事情:分配一个正确对齐并调整大小的缓冲区以容纳maxwordschar*,这正是你想要存储指向字符串的指针。

执行此操作时,将再次复制此问题:

words[numberOfWords] = calloc(max, sizeof(char*)); // wrong

同样,wordschar**,因此words[anything]char*,因此,应根据指向类型的大小分配一个分配: char。以下任何一种都可以这样做:

words[numberOfWords] = calloc(max, sizeof(char));   // right, or...
words[numberOfWords] = calloc(max, sizeof **words); // right

好的,所有这些都说,你怀疑这是错误的:

words = realloc(words, maxWords);

是有根据的。 realloc函数将字节数作为第二个参数。您正在传递count of pointers,但不包括请求的字节数中每个指针的大小。使用前面描述的语法,可以这样做:

words = realloc(words, maxWords * sizeof *words);

words = realloc(words, maxWords * sizeof(char*));

两者都可以工作,现在包括每个指针的大小,从而计算要请求的正确字节数。

祝你好运。