动态分配数组的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问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个分配 C 中动态分配二维数组

动态内存分配(c语言)

动态分配数组时的C ++ new vs new [] [重复]

如何在 C 中找到动态分配数组的大小?

如何在 C 中动态分配二维数组? [复制]

二维对象数组 c 锐利的动态值分配