双指针不';t获得malloc';d在功能上
所以我在C语言中工作,在一个函数中有一个双指针不';t获得malloc';d在功能上,c,gdb,C,Gdb,所以我在C语言中工作,在一个函数中有一个int**,在另一个函数中修改。当我运行这个问题时,我遇到了一个SegFault,所以我决定用gdb调试它。我发现内存从未分配给这个数组。我的功能是这样的 void declarer() { int ** a; alocator(a, 4, 5); for (int i = 0; i < 4; i++) for (int j = 0; j < 5; j++) printf("%d\
int**
,在另一个函数中修改。当我运行这个问题时,我遇到了一个SegFault,所以我决定用gdb
调试它。我发现内存从未分配给这个数组。我的功能是这样的
void declarer()
{
int ** a;
alocator(a, 4, 5);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
printf("%d\n", a[i][j]);
}
void alocator(int ** a, int b, int c)
{
a = (int **)malloc(sizeof(int *) * b);
for (int i = 0; i < b; i++) {
a[i] = (int *)malloc(sizeof(int) * c);
for (int j = 0; j < c; j++)
a[i][j] = j;
}
}
void declarer()
{
国际**a;
alocator(a,4,5);
对于(int i=0;i<4;i++)
对于(int j=0;j<5;j++)
printf(“%d\n”,a[i][j]);
}
无效alocator(整数**a、整数b、整数c)
{
a=(int**)malloc(sizeof(int*)*b);
对于(int i=0;i
当我运行
gdb
时,在alocator(a,4,5)
(在程序segfaults之前)行后面有一个断点,然后我写入pa
,我得到$1=(int**)0x0
,这表明a
在地址0x0
处,并且没有为它分配内存。为什么alocator
没有分配内存给它,我怎样才能让alocator
分配内存给a
?因为你要按值传递**a
,你必须把它作为指针传递。因此,请使用三重指针:
void declarer()
{
int **a;
alocator(&a, 4, 5);
...
}
void alocator(int ***a, int b, int c)
{
*a = (int **)malloc(sizeof(int *) * b);
...
因为您要通过值传递
**a
,所以必须将其作为指针传递。因此,请使用三重指针:
void declarer()
{
int **a;
alocator(&a, 4, 5);
...
}
void alocator(int ***a, int b, int c)
{
*a = (int **)malloc(sizeof(int *) * b);
...
将变量
a
按值传递给函数,这样它的值就不会改变。您有两种解决方案:
将函数更改为接受int***
类型的值并按地址传递a
,或者将函数的返回值更改为int**
,并在调用时使用该值
例如:
void declarer()
{
int ** a = alocator(4, 5);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
printf("%d\n", a[i][j]);
}
int **alocator(int b, int c)
{
int **a = (int **)malloc(sizeof(int *) * b);
for (int i = 0; i < b; i++) {
a[i] = (int *)malloc(sizeof(int) * c);
for (int j = 0; j < c; j++)
a[i][j] = j;
}
return a;
}
void declarer()
{
int**a=alocator(4,5);
对于(int i=0;i<4;i++)
对于(int j=0;j<5;j++)
printf(“%d\n”,a[i][j]);
}
int**alocator(int b、int c)
{
int**a=(int**)malloc(sizeof(int*)*b);
对于(int i=0;i
通过值将变量a
传递给函数,因此其值不会更改。您有两种解决方案:
将函数更改为接受int***
类型的值并按地址传递a
,或者将函数的返回值更改为int**
,并在调用时使用该值
例如:
void declarer()
{
int ** a = alocator(4, 5);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 5; j++)
printf("%d\n", a[i][j]);
}
int **alocator(int b, int c)
{
int **a = (int **)malloc(sizeof(int *) * b);
for (int i = 0; i < b; i++) {
a[i] = (int *)malloc(sizeof(int) * c);
for (int j = 0; j < c; j++)
a[i][j] = j;
}
return a;
}
void declarer()
{
int**a=alocator(4,5);
对于(int i=0;i<4;i++)
对于(int j=0;j<5;j++)
printf(“%d\n”,a[i][j]);
}
int**alocator(int b、int c)
{
int**a=(int**)malloc(sizeof(int*)*b);
对于(int i=0;i
因为您通过值传递a
。“双指针”通常是double*
!因为您通过值传递a
。“双指针”通常是double*
!在使用此选项时,我如何分配a[I]
和a[I][j]
?我是否也需要将它们称为*a[I]
和*a[I][j]
。或者(*a)[i][j]
,我不记得优先顺序。这是(*a)[i][j]
在使用这个时,我如何分配a[i]
和a[i][j]
?我是否也需要将它们称为*a[I]
和*a[I][j]
。或者(*a)[i][j]
,我不记得优先顺序。它是(*a)[i][j]