realloc 在 while 循环中不起作用
Realloc doesn't work in a while loop
我的 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]='[=10=]';
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
分配 space,将结果分配给 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 **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);
请注意,不仅是语法,上面两个列表中最后三个的实际 code 也是 相同,保存对于指针类型本身(第一个是指向整数的指针,第二个是指向字符的指针)。该语法利用了 sizeof
运算符(它不是函数或宏;它是运算符)如何用于 变量 而不是 类型.
就是说,您的代码中的 words
是一个指向字符的指针。我应该使用类似的语法来分配适当的大小。以下任一项都可以正常工作:
char **words = calloc(maxwords, sizeof(char*)); // right, uses specific type
char **words = calloc(maxwords, sizeof *words); // right, gets size from var type
两者做同样的事情:分配一个正确对齐和大小的缓冲区以容纳 maxwords
数量的 char*
,正是您想要存储指向字符串的指针。
当你这样做时,这个问题会再次出现:
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
函数将 字节数 作为第二个参数。您传递的是 count of pointers
,但不包括请求字节数中每个指针的大小。使用前面描述的语法,这可以完成为:
words = realloc(words, maxWords * sizeof *words);
或
words = realloc(words, maxWords * sizeof(char*));
两者都可以,现在包括每个指针的大小,从而计算出要请求的正确字节数。
祝你好运。
我的 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]='[=10=]';
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
分配 space,将结果分配给 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 **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);
请注意,不仅是语法,上面两个列表中最后三个的实际 code 也是 相同,保存对于指针类型本身(第一个是指向整数的指针,第二个是指向字符的指针)。该语法利用了 sizeof
运算符(它不是函数或宏;它是运算符)如何用于 变量 而不是 类型.
就是说,您的代码中的 words
是一个指向字符的指针。我应该使用类似的语法来分配适当的大小。以下任一项都可以正常工作:
char **words = calloc(maxwords, sizeof(char*)); // right, uses specific type
char **words = calloc(maxwords, sizeof *words); // right, gets size from var type
两者做同样的事情:分配一个正确对齐和大小的缓冲区以容纳 maxwords
数量的 char*
,正是您想要存储指向字符串的指针。
当你这样做时,这个问题会再次出现:
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
函数将 字节数 作为第二个参数。您传递的是 count of pointers
,但不包括请求字节数中每个指针的大小。使用前面描述的语法,这可以完成为:
words = realloc(words, maxWords * sizeof *words);
或
words = realloc(words, maxWords * sizeof(char*));
两者都可以,现在包括每个指针的大小,从而计算出要请求的正确字节数。
祝你好运。