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*)
在firstmalloc()
[当您试图为二维数组分配内存时]
试试这个:
a=(int**)malloc(sizeof(int*)*5);
a
是指向int
的指针,即int**
您正在将malloc()
的返回值强制转换为int*
,然后将其分配给int**
,因此从int*
到int**
的隐式转换将生成警告。此外,它应该是sizeof(int*)
在firstmalloc()
[当您试图为二维数组分配内存时]
试试这个:
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
),该变量是指向整数的指针