c语言动态记忆

sna*_*kec 1 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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

c:8: warning: assignment from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 5

首先,代码中的内存分配不正确.第一个malloc看起来如下

a = (int **) malloc(sizeof(int *) * 5);
Run Code Online (Sandbox Code Playgroud)

aint **,你宣布它.您是铸造的结果mallocint *.int *并且int **是编译器警告您的那些不兼容的类型.为避免将来出现此类错误,请摆脱在语句中使用类型的坏习惯.C中的类型属于声明.陈述应尽可能与类型无关.上面的malloc调用看起来会好得多

a = malloc(5 * sizeof *a);
Run Code Online (Sandbox Code Playgroud)

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

a[i] = malloc(3 * sizeof *a[i]);
Run Code Online (Sandbox Code Playgroud)

我希望你看到这些malloc调用建立的模式.

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

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