Realloc不';I don’我不能在一段时间内工作

Realloc不';I don’我不能在一段时间内工作,c,memory-leaks,realloc,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,sizeo

我的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)这行,但我不知道具体是什么


有什么帮助吗?

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
运算符(它不是函数或宏;它是运算符)如何用于变量而不是类型

也就是说,代码中的单词是指向char的指针。我应该使用类似的语法来分配适当的大小。以下任一项都将正常工作:

char **words = calloc(maxwords, sizeof(char*)); // right, uses specific type
char **words = calloc(maxwords, sizeof *words); // right, gets size from var type
两者都做同样的事情:分配一个适当对齐和大小的缓冲区,以容纳
maxwords
字符数*,这正是存储字符串指针所需要的

执行以下操作时,此问题会再次出现:

words[numberOfWords] = calloc(max, sizeof(char*)); // wrong
同样,
words
char**
,因此
words[anything]
char*
,因此,应该根据指向类型的大小分配一个分配:
char
。以下任一项都将执行此操作:

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

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

words = realloc(words, maxWords);
这是有根据的。
realloc
函数将字节计数作为第二个参数。您正在传递一个
指针计数
,但在请求的字节数中不包括每个指针的大小。使用前面描述的语法,这可以通过以下方式完成:

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

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


祝你好运。

为什么要用realloc单词,而不是等待完整输入?为什么不只是malloc一个输入的副本呢?第一次投入分配在哪里?为什么要把它放在循环的末尾?@Rahullaina为什么
realloc()
不能在循环中工作?我高度怀疑我对诸如
maxWords
numberOfWords
currentSize
max
I
input
等事物的类型和值的猜测。,我不会和你的实际跑步价值观保持一致。所以在读取输入时发布@Ôrel,没有可复制的字符串。在调用
calloc
时使用
maxWords
numberOfWords
后,您将设置它们的值。那可能是沃龙。您还得到了错误的分配:指针不需要为自身分配空间,只需要为它指向的内容分配空间:
Type*p=calloc(n,sizeof*p)单词[numberOfWords-1]这是一个打字错误。我更改了代码,但没有注意到。谢谢,我会试试
words=realloc(words,maxWords*sizeof*words)
仍然错误,因为它在故障模式下错误地泄漏内存(当
realloc
返回
NULL
时)。它的用法更像:
void*temp=realloc(words,maxWords*sizeof*words)
如果(temp==NULL){/*XXX:执行错误处理并返回、中断、退出或任何*/}
words=temp
words = realloc(words, maxWords * sizeof(char*));