嗨,各方都支持他们,但没有人提供我所需的信息,现在我尝试做这样的程序
#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个值,但它没有显示用户输入的值 任何人都可以解释我做错了什么,任何机构都能解释我双指针的概念吗?动态内存分配
答案 0 :(得分:5)
首先,代码中的内存分配不正确。第一个malloc
应如下所示
a = (int **) malloc(sizeof(int *) * 5);
您宣布的a
为int **
。您正在将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}},因此不需要强制转换。
您可能想要阅读此内容:
答案 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));