动态分配数组的c问题
Posted
技术标签:
【中文标题】动态分配数组的c问题【英文标题】:Problem with c with dynamically allocating an array 【发布时间】:2022-01-17 23:50:07 【问题描述】:#include <stdio.h>
#include <stdlib.h>
void input_all(char* array)
int c = 0;
int increse = 20;
int number_of_char = 0;
for (int increment = 0; (c = getchar()) != '\n'; increment++)
++number_of_char;
if (number_of_char % 10)
array = (char*)realloc(array, increse + sizeof(char));
if (array == NULL)
printf("not alocated!");
exit(22);
increse += 10;
array[increment] = c;
printf("%s\n", array);
int main(void)
char* array = (char*)malloc(10);
if (array == NULL)
printf("not alocated\n");
exit(33);
input_all(array);
printf("%s\n", array);
return 0;
所以我要做的是用 getchar 填充“数组”。当我尝试将其打印出来时,最后(大多数情况下)会得到一些垃圾值。我认为问题在于我用 realloc 给了很多空间来“排列”,但我不知道如何解决它。我还尝试在 malloc 和 realloc 和 increse 中将所有大小设置为 1,这样每当我得到一个字符时,“array”的大小就会增加,但它仍然不起作用。 任何人都知道如何修复它? 提前致谢!
【问题讨论】:
你重新分配,但你没有返回新地址for(int increment = 0; (c = getchar()) != '\n'; increment++)
如果您的输入流在没有提供换行符的情况下关闭,则将成为无限循环。您还必须检查 EOF。
@Ôrel 我该怎么做?你能至少给我一个链接吗,我试着在网上寻找,但找不到任何有用的东西。
@WilliamPursell 好吧,在按下 '\n' 之前,我希望有无限数量的句子。这是一件坏事吗?
只是return array;
【参考方案1】:
array
必须以 null 结尾,否则 printf
和其他 c-string 函数不知道字符串的结尾在哪里。
realloc
可能不会返回相同的地址(尽管这在您的 PC 上不是问题),您必须使用指针的地址。
您可以分配整个数组realloc
。如果后续realloc
失败,则不必退出,可以打印错误并返回已分配的字符串。
void input_all(char** parray)
char* arr = NULL;
int size = 0, i = 0;
while(1)
int c = fgetc(stdin);
if (c == '\n' || c == EOF)
break;
if (i == size)
size += 10;
char* temp = realloc(arr, size + 1);
if (temp == NULL) printf("realloc failed\n"); break;
arr = temp;
arr[i++] = (char)c;
if(arr)
arr[i] = '\0'; //<- don't forget to terminate the string with 0
*parray = arr;
int main(void)
char* array = NULL;
input_all(&array);
if (!array)
return 1;
printf("%s\n", array);
free(array);
return 0;
【讨论】:
以上是关于动态分配数组的c问题的主要内容,如果未能解决你的问题,请参考以下文章