c语言动态记忆

时间:2010-10-04 10:27:34

标签: c

嗨,各方都支持他们,但没有人提供我所需的信息,现在我尝试做这样的程序

#include<stdio.h>
#include <stdlib.h>
int main()
{
    int **a,i,j;
    system("clear");

    a=(int*)malloc(sizeof(int)*5);

    for (i=0; i<5; i++)
    {
        a[i]= malloc(sizeof(int)*3);

        for (j=0; j<3; j++)
        {
            printf("\nplease enter the [%d][%d] location = ",i,j);
            scanf("%d",&a[i][j]);
        }
    }


    for (i=0; i<5; i++)
    {
        for (j=0; j<3; j++)
        {
            printf("\nthe value enter  enter the [%d][%d] location = ",i,j);
            printf("%d",a[i][j]);
        }
    }
    free(a);
    return ;
}

我在编译时遵守了它,显示了warnig正在跟随

c:8: warning: assignment from incompatible pointer type

在运行程序时,它从用户那里取15个值,但它没有显示用户输入的值 任何人都可以解释我做错了什么,任何机构都能解释我双指针的概念吗?动态内存分配

5 个答案:

答案 0 :(得分:5)

首先,代码中的内存分配不正确。第一个malloc应如下所示

a = (int **) malloc(sizeof(int *) * 5);

您宣布的aint **。您正在将malloc的结果投射到int *int *int **是编译器警告您的不兼容类型。为避免将来出现此类错误,请摆脱在语句中使用类型的坏习惯。 C中的类型属于声明语句应尽可能与类型无关。上述malloc调用看起来会更好

a = malloc(5 * sizeof *a);

注意:没有演员表,没有提到类型。第二个malloc看起来如下

a[i] = malloc(3 * sizeof *a[i]);

我希望您能看到这些malloc调用构建的模式。

您还忘记为程序中的各个子数组释放内存(a[i]内存永远不会被释放,而a内存则是。)

至于没有显示输入值的程序......损坏malloc调用的第一个问题严重到足以阻止您的程序运行,但它仍然可能在某些平台上“正常工作”。在这样的平台上,它应该显示值。你确定你不是简单地错过输出吗?

答案 1 :(得分:3)

此代码有几个错误。首先,警告指的是您正在尝试将指向整数(int *)的指针分配给变量(a),该变量是指向整数的指针({{ 1}}),你实际上想要用作数组数组。

所以,第一次修正,在第8行,它不是

int **

但它是

a=(int*)malloc(sizeof(int)*5);

(在C 中强制转换并不是绝对必要的,但作为一名C ++程序员,我更喜欢这样做)

请注意,a=(int**)malloc(sizeof(int *)*5); 中的表达式也发生了变化,因为您要分配的内容不是五个整数的空间,而是五个指针到整数的空间。

然后,在应用程序结束时,您只是sizeof分配了第一个free的空间,而您进行了其他五个分配(每行一个)。因此,您可以在显示每一行之后的最后一个循环中进行重新分配。

malloc

请记住:对于每个for (i=0; i<5; i++) { for (j=0; j<3; j++) { printf("\nthe value enter enter the [%d][%d] location = ",i,j); printf("%d",a[i][j]); } free(a[i]); a[i]=NULL; } free(a); a=NULL; malloc,您必须拥有相应的calloc,否则就会泄漏内存。

这里,在每次重新分配之后,我将相应的指针设置为free,以丢弃那些旧的,现在无效的指针。有人说这种行为可以掩盖双重释放(因为NULL不会产生错误),但恕我直言这比其他选择更好

一个重要的细节:你没有检查free(NULL)的返回值,这是非常糟糕的。在这么小的程序中,分配可能会失败,但是,总是检查malloc的返回值是否为malloc,这是一个好习惯。案例,优雅地处理情况,通常释放所有资源并关闭应用程序。

顺便说一句,NULL很难看。您应该使用特定于平台的方式来清理屏幕,如果封装在一个函数中则更好;在具有普通(X3.64)终端仿真器的Linux上,这样的事情可能没问题:

system("clear");

答案 2 :(得分:1)

a指向一个int指针数组。因此,该数组的每个元素都是int*而不是int。所以你应该使用sizeof(int*)

a = (int*)malloc(sizeof(int)*5);

应该是

a = malloc(sizeof(int*)*5);
                   ^

由于C中的malloc返回一个void指针而C隐式地从void*转换为{{1}},因此不需要强制转换。

您可能想要阅读此内容:

Should I explicitly cast malloc()'s return value?

答案 3 :(得分:1)

   a = (int*)malloc(sizeof(int)*5);
     ^
     |
Warning due to this

a是指向int指针的指针,即int **

您将malloc()的返回值转换为int*,然后将其分配给int**,以便从int*隐式转换为int**生成警告。此外,它应该在sizeof(int *)malloc() [因为你正试图为二维数组分配内存]。

试试这个:

a=(int**)malloc(sizeof(int*)*5);

答案 4 :(得分:0)

第6行你应该

a = (int**) malloc(sizeof(int*) * 5));