c语言动态存储器

c语言动态存储器,c,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);

大家好,谢谢大家的支持,但是没有人提供我所需要的信息,现在我试着这样做

#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 ;
}
在运行程序时,它从用户处获取15个值,但未显示用户输入的值
有人能解释我做错了什么吗,有人能解释一下双指针和动态内存分配的概念吗。因此,该数组的每个元素的类型都是
int*
而不是
int
。所以您应该使用
sizeof(int*)

这个

应该是

a = malloc(sizeof(int*)*5);
                   ^
正如在C中一样,返回一个
void
指针,C隐式地从
void*
和向
void*
进行强制转换,不需要强制转换

您可能需要阅读以下内容:


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

这个

应该是

a = malloc(sizeof(int*)*5);
                   ^
正如在C中一样,返回一个
void
指针,C隐式地从
void*
和向
void*
进行强制转换,不需要强制转换

您可能需要阅读以下内容:

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

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

试试这个:

a=(int**)malloc(sizeof(int*)*5);
a
是指向
int
的指针,即
int**

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

试试这个:

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

在第6行,你应该

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

在第6行,你应该

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

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

a = (int **) malloc(sizeof(int *) * 5);
a[i] = malloc(3 * sizeof *a[i]);
您的
a
是您声明的
int**
。您正在将
malloc
的结果强制转换为
int*
int*
int**
是编译器警告您的不兼容类型。为了避免将来出现此类错误,请改掉在语句中使用类型的坏习惯。C中的类型属于声明。语句应该尽可能独立于类型。通过这种方式,上面的
malloc
调用看起来会更好

a = malloc(5 * sizeof *a);
注:无铸造,未提及类型。第二个
malloc
如下所示

a = (int **) malloc(sizeof(int *) * 5);
a[i] = malloc(3 * sizeof *a[i]);
我希望您看到构建这些
malloc
调用所依据的模式

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


至于没有显示输入值的程序。。。中断的
malloc
调用的第一个问题严重到足以阻止您的程序工作,但在某些平台上它仍然可能“工作”。在这样的平台上,它应该显示值。您确定没有丢失输出吗?

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

a = (int **) malloc(sizeof(int *) * 5);
a[i] = malloc(3 * sizeof *a[i]);
您的
a
是您声明的
int**
。您正在将
malloc
的结果强制转换为
int*
int*
int**
是编译器警告您的不兼容类型。为了避免将来出现此类错误,请改掉在语句中使用类型的坏习惯。C中的类型属于声明。语句应该尽可能独立于类型。通过这种方式,上面的
malloc
调用看起来会更好

a = malloc(5 * sizeof *a);
注:无铸造,未提及类型。第二个
malloc
如下所示

a = (int **) malloc(sizeof(int *) * 5);
a[i] = malloc(3 * sizeof *a[i]);
我希望您看到构建这些
malloc
调用所依据的模式

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


至于没有显示输入值的程序。。。中断的
malloc
调用的第一个问题严重到足以阻止您的程序工作,但在某些平台上它仍然可能“工作”。在这样的平台上,它应该显示值。您确定没有丢失输出吗?

此代码有几个错误。首先,警告是指您试图将指向整数(
int*
)的指针分配给变量(
a
),该变量是指向整数(
int**
)的指针,您实际上希望将其用作数组数组

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

a=(int*)malloc(sizeof(int)*5);
但事实确实如此

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

(C中的C并不是严格必要的,但作为C++程序员,我更喜欢保持它)

请注意,
sizeof
中的表达式也发生了变化,因为您要分配的不是五个整数的空间,而是五个整数指针的空间

然后,在应用程序结束时,您将
释放
第一个
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;

这段代码有几个错误。首先,警告是指您试图将指向整数(
int*
)的指针赋给变量(
a
),该变量是指向整数的指针