【问题标题】:Dynamic memory allocation with / without function带/不带功能的动态内存分配
【发布时间】:2020-11-15 12:47:55
【问题描述】:

我尝试创建为二维数组动态分配内存并将一些整数值放入数组的函数。总体而言,该功能按预期工作,但存在一些错误。所以我在main() 中做了同样的事情并得到了正确的结果。我的代码如下:

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

void test(int d1, int d2, int ***p){
    int value;
    *p = (int **)(malloc(sizeof(int)*d1));
    for (int i = 0; i < d1; i++){
        (*p)[i] = (int *)(malloc(sizeof(int)*d2));
        for (int j = 0; j < d2; j++){
            (*p)[i][j] = i * 10 + j;
        }
    }
    printf("\n");
}


int main(void){
    int d1, d2;
    int ** ptr;

    printf("length of 1st dimension?\n");
    scanf("%d", &d1);
    printf("length of 2nd dimension?\n");
    scanf("%d", &d2);
    test(d1, d2, &ptr);
    for (int i=0; i<d1; i++){
        for (int j=0; j<d2; j++){
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
    free(ptr);

    ptr = (int **)(malloc(sizeof(int)*d1));
    for (int i=0; i< d1; i++){
        ptr[i] = (int *)(malloc(sizeof(int)*d2));
        for (int j=0; j<d2; j++){
            ptr[i][j] = i *10 +j;
        }
    }   

    printf("\n######################\n\n");

    for (int i=0;i<d1;i++){
        for (int j=0; j<d2;j++){
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
    free(ptr);

    return 0;
}`

当我将 5 作为第 1 维和第 2 维的长度传递时,我得到如下结果:

length of 1st dimension?
5
length of 2nd dimension?
5

532699424 32725 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

######################

0 1 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

我认为,除了我将指向指针的指针作为参数传递给函数之外,我做了同样的事情。但是,第一行中的某些值是不同的。每当我执行该函数时,第一行的值就不同。

谁能告诉我我做错了什么?

提前谢谢你。

【问题讨论】:

  • free(ptr) 的调用都泄漏了大量内存。您必须更加努力地释放这些数组。您可能需要一个函数来正确完成这项工作(至少,避免两次编写相同的代码)。

标签: c pointers malloc


【解决方案1】:

线条

    *p = (int **)(malloc(sizeof(int)*d1));
    ptr = (int **)(malloc(sizeof(int)*d1));

错了。元素是int*,但每个元素只分配int 的空间。 如果int* 大于int(例如,int* 为 8 字节,int 为 4 字节),这可能会导致问题。

线条应该是

    *p = malloc(sizeof(int*)*d1);
    ptr = malloc(sizeof(int*)*d1);

或(通过避免手动输入类型来减少出错的风险)

    *p = malloc(sizeof(*p)*d1);
    ptr = malloc(sizeof(*ptr)*d1);

另请参阅:c - Do I cast the result of malloc? - Stack Overflow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多