【问题标题】:What am I getting wrong on malloc and realloc understanding?我对 malloc 和 realloc 的理解有什么问题?
【发布时间】:2026-01-31 20:55:01
【问题描述】:

我试图创建一个可以在程序运行时调整大小的数组。我已经了解了 malloc 和 realloc 函数,但显然我弄错了。这是我编写的函数,它根据循环次数创建一个数组。

int* flexibleArray() {
    int *arrayFlex = NULL;
    int number=0, cnt=0;
    while (number!=-1) {
        printf("\nInsert the variable: ");
        scanf("%d", &number);
        if (number==-1){
            break;
        }
        cnt+=1;
        arrayFlex = realloc(arrayFlex, cnt * sizeof(int));
        arrayFlex[cnt-1] = number;
    }
    return arrayFlex;
}

我尝试阅读在互联网上找到的有关它的文档,但在重新分配后我无法检索新数组。

int *array;
    array = flexibleArray();
    int arraySize = (sizeof(array))/(sizeof(int));
    for(int i=0; i<arraySize; i++) {
        printf("%d ", array[i]);
    }

基本上这是我测试函数的地方,看看它是否能做它应该做的事情。

我是 C 新手,对不起。 谢谢

【问题讨论】:

  • ... 是有效的,虽然在这里没用。
  • 你的函数(仍然)被声明为返回一个int,而你似乎希望它返回一个指针。
  • 如果你想返回int *,那么就这样做(并声明)。而且,当指针尚未初始化时,您修改后的代码会尝试realloc() 指向的空间arrayFlex。目前还不清楚你为什么要接受它作为参数——我只是把它变成一个局部变量,适当地初始化为NULL
  • 这个:int arraySize = (sizeof(array))/(sizeof(int)); 没有做你认为的事情。 (它最有可能做的是总是返回 2。在任何给定平台上,它总是返回相同的小数字,通常是一两个。)没有办法让 C 告诉你动态调整大小的数组的当前大小,所以你必须返回大小和指针。
  • 关于编辑:int flexArray = NULL 缺少分号并且名称错误。

标签: c malloc realloc


【解决方案1】:

应该这样做。

int* flexibleArray() {                                                          
    int *arrayFlex = NULL;                 // needs to be a pointer             
    int number=0, cnt=0;                                                        
    while (number!=-1) {                                                        
        printf("\nInsert the variable: ");                                      
        scanf("%d", &number);                                                   
        if (number==-1){                                                        
            break;                                                              
        }                                                                       
        cnt+=1;                                                                 
        arrayFlex = realloc(arrayFlex, cnt * sizeof(int));                      
        arrayFlex[cnt-1] = number;                                              
    }                                                                           
    return arrayFlex;                                                           
}     

编辑:修正错别字。

【讨论】:

  • 谢谢,我错过了 flexArray 上的指针。我想我应该多练习一下指针,在这种情况下它们只会让我感到困惑
  • @L_Cleo 不用担心,指针有点混乱。顺便说一句,您使用的是什么编译器?大多数编译器都可以选择打开更多警告,这非常有用,尤其是在学习 C 时。
  • 我通常使用 Xcode,因为我自己也在学习 swift,但显然我必须在大学学习 C,所以我只是尝试通过终端进行编译,就像在考试中一样
  • @EricPostpischil 我已经修正了错别字。现在可以编译了。
  • @L_Cleo 我建议使用clang -Wall -Wextra -Werror 来编译,而不是clang。这将打开许多额外的警告,这将在很多情况下为您提供帮助(例如您的问题中的那个)。
最近更新 更多