gpt4 book ai didi

c - 二维数组上的指针

转载 作者:行者123 更新时间:2023-11-30 15:55:49 25 4
gpt4 key购买 nike

我有一个段错误,想知道我的错误在哪里。

让我解释一下。

在我的 main 中,我声明了一个 3D 数组:int*** Matricegroupegeneralisant

然后这个main使用了一个函数recuperationinfoFich(&matricegroupegeneralisant);该函数声明为:recuperationinfoFich(int* * * * matricegroupegeneralisant)

此函数recuperationinfoFich使用另一个函数recuperationmatricegroupesgeneralisants(matricegroupegeneralisantA[Ni]);该函数声明为 recuperationmatricegroupesgeneralisants( int*** matricegroupegeneralisant)

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void allocationdynamiquetableautroisdimdentier(int**** Matrice,int nbniveau, int nbligne, int nbcolonne)
{
int i,j;
*Matrice=(int***) malloc (sizeof(int**)*nbniveau);
for (i=0; i<nbniveau; i++)
{
(*(Matrice))[i]=(int**) malloc (sizeof(int*)*nbligne); // allocation dynamique de la matrice Matrice
for (j=0; j<nbligne; j++)
{
((*(Matrice))[i])[j]=(int*) malloc (sizeof(int)*nbcolonne);
}
}
}


void recuperationmatricegroupesgeneralisants(int*** matricegroupegeneralisantA)
{
(*matricegroupegeneralisantA)[0][1]=1;
}

void recuperationinfoFich(int**** matricegroupegeneralisantA)
{
allocationdynamiquetableautroisdimdentier(matricegroupegeneralisantA,3, 3, 7);
recuperationmatricegroupesgeneralisants(matricegroupegeneralisantA[1]);
}



void main(int args, char **argv)
{

int*** matricegroupegeneralisantA;

recuperationinfoFich(&matricegroupegeneralisantA);
}

使用 Gdb:

(gdb) r
Starting program: /home/larimsna1/Desktop/a.out

Breakpoint 1, 0x000000000040061a in main ()
(gdb) n
Single stepping until exit from function main,
which has no line number information.

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005c8 in recuperationmatricegroupesgeneralisants ()
(gdb)

最佳答案

我怀疑这个问题与你的分配函数有关。话虽这么说,您提供的代码存在许多功能和风格问题。在一个地方,您未能多次取消引用指针,导致您将整数分配给指针类型。当您无法简单地传递参数并使用返回值时,您在大多数事务中不必要地使用指针。

这段代码应该做你想要的,并且应该正常工作,并且更容易阅读:

// allocation, returns pointer to allocated value
int *** allocationdynamique(int nbniveau, int nbligne, int nbcolonne)
{
int *** Matrice;
int i, j;
Matrice = (int ***) malloc (sizeof(*Matrice) * nbniveau);
for (i = 0; i < nbniveau; ++i)
{
Matrice[i] = (int **) malloc (sizeof(**Matrice) * nbligne);
for (j = 0; j < nbligne; ++j)
{
Matrice[i][j] = (int *) malloc (sizeof(***Matrice) * nbcolonne);
}
}
return Matrice;
}

// computation, takes 2D array, modifies in place
void recuperationmatrice(int** matrice)
{
matrice[0][1] = 1;
}

// you shouldn't use void main, its not part of the standard
int main(int args, char **argv)
{
int*** matrice = allocationdynamique(3, 3, 7);
recuperationmatrice(matrice[1]);

return 0;
}

此外,从风格角度来看,您的变量名称长得离谱,您应该在运算符周围使用空格。

此代码中的许多错误都是编译器能够检测到并警告您的错误。它们是有效的 C 代码,可以正确编译,但在这种情况下和大多数其他情况下都是错误编写的,并且不会按预期工作。您应该使用编译器警告进行编译,以消除可能的意外:

gcc -Wall -c file.c -o file.o

关于c - 二维数组上的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11727056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com