我的细分错误,想知道我的错误在哪里。
让我解释。
在我的主机中,我声明了一个3D数组:int*** Matricegroupegeneralisant
然后这个主要使用功能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 - 2D数组上的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11727056/