【问题标题】:Malloc and Realloc for Int Array [duplicate]Int 数组的 Malloc 和 Realloc [重复]
【发布时间】:2022-11-22 23:43:40
【问题描述】:

我刚刚开始学习malloc()realloc(),在测试它们时,我遇到了重新分配 int 数组大小的问题。

该程序应该创建一个数组,最初大小为 2,但它应该增加其大小并将值增加十倍。但是它并没有增加它的大小,输出最终是array = {0,1},而它应该是array = {0,1,2,3,4,5,6,7,8,9}

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int *array= malloc(sizeof(int)*2);
    for (int x = 0; x < 10; x++) {
        array = realloc(array, sizeof(int)*(2+x));
        array[x] = x;
    }
    for (int i = 0; i<(sizeof(array)/sizeof(array[0])); i++) {
        printf("%d\n",array[i]);
    }
    printf("array size: %ld\n",sizeof(array)/sizeof(array[0]));
    free(array);
}

有人可以解释为什么它不起作用吗?我试过寻找答案,但这些对我来说都没有意义哈哈。

【问题讨论】:

  • (sizeof(array)/sizeof(array[0]) 不能使用指针。
  • 无论指向多少内存,sizeof(pointer) 始终相同。该信息未内置,您需要手动跟踪内存大小。
  • 因为array是一个指针, sizeof(array)sizeof(int *) 在 32 位机器上是 4 个字节,在 64 位机器上是 8 个字节。对于大多数 [现代] 机器,sizeof(int) 是 4 [但可能是 2 甚至 8],所以我们最终根据体系结构将一个固定数除以一个固定数。因此,我们可以将:1、2、4、8 作为值。但是,从来没有像 1000 这样的东西。
  • 存储数组中元素数量的计数,并在分配更多空间时调整该计数。不要忘记检查内存分配是否有效。

标签: c for-loop malloc dynamic-memory-allocation realloc


【解决方案1】:

问题是sizeof(array) 只会返回指针的大小(在 64 位系统上为 8 个字节)。您需要在另一个变量中跟踪数组大小。例如...

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int *array= malloc(sizeof(int));
    int size;
    for (size = 0; size < 10; size++) {
        array = realloc(array, sizeof(int)*(1+size));
        array[size] = size;
    }
    for (int i = 0; i<size; i++) {
        printf("%d
",array[i]);
    }
    printf("array size: %ld
",size*sizeof(int));
    free(array);
}

【讨论】:

    【解决方案2】:

    表达方式

    sizeof(array)/sizeof(array[0])
    

    相当于

    sizeof( int * )/sizeof( int )
    

    并根据使用的系统产生 2 或 1。

    还有这个语句中的表达式(2+x)

    array = realloc(array, sizeof(int)*(2+x));
    

    在 for 循环的每次迭代中使用没有意义。

    看来你的意思如下

    enum { N = 10 };
    size_t n = 2;
    
    int *array = malloc( n * sizeof( int ) );
    for ( int x = 0; x < N; x++ ) {
        if ( n <= x )
        {
            n += 2;
            array = realloc( array, n * sizeof( int ) );
        }
        array[x] = x;
    }
    
    for ( int i = 0; i < N; i++ ) {
        printf("%d
    ",array[i]);
    }
    
    free(array);
    

    一般来说,在调用 pf realloc 中使用中间指针更安全,例如

    int *tmp = realloc( array, n * sizeof( int ) );
    if ( tmp != NULL ) array = tmp;
    

    否则,如果 realloc 的调用将返回空指针,则您可以释放分配的内存。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2011-07-03
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多