在C中声明全局多维数组
所以,我试图全局声明一个三维整数数组,这样它就可以被两个单独的函数使用 最初,我尝试过这个(在C中声明全局多维数组,c,pointers,multidimensional-array,global-variables,declaration,C,Pointers,Multidimensional Array,Global Variables,Declaration,所以,我试图全局声明一个三维整数数组,这样它就可以被两个单独的函数使用 最初,我尝试过这个(solns是3D阵列的名称): 但是,尽管三重指针solns确实在函数之间存在,但我放在其中的信息却不存在。当第二个函数尝试访问第一个函数放置在solns中的数据时,这会给我一个segfault 我应该如何声明这一点,以使其中的信息保持不变?我试过了 static int solns[][][]; 除此之外,gcc不喜欢我尝试的其他任何东西 编辑:函数1中的这段代码将数据放入数组: solns[k] =
solns
是3D阵列的名称):
但是,尽管三重指针solns
确实在函数之间存在,但我放在其中的信息却不存在。当第二个函数尝试访问第一个函数放置在solns
中的数据时,这会给我一个segfault
我应该如何声明这一点,以使其中的信息保持不变?我试过了
static int solns[][][];
除此之外,gcc不喜欢我尝试的其他任何东西
编辑:函数1中的这段代码将数据放入数组:
solns[k] = realloc(solns[k],sizeof(solns[k])/sizeof(int*)+sizeof(int*));
solns[k][l] = realloc(solns[k][l],sizeof(int)*4*sC);
for(i=0;i<sC*4;i++)
{
solns[k][l][i] = row[i];
}
l++;
但是
solns[i]
在该点上是一个空指针,因为solns
指向的数据不会继续。在全局范围中使用术语static
时,意味着该对象/变量的实例对于每个编译单元都是本地的
这意味着每个.cpp
文件将具有上述变量的不同版本。因此,如果您的函数位于两个不同的文件中,它将无法工作
要解决此问题,请在
.cpp
文件中定义此变量,并在头文件中将其声明为外部文件。在全局范围中使用术语static
,这意味着该对象/变量的实例对于每个编译单元都是本地的
这意味着每个.cpp
文件将具有上述变量的不同版本。因此,如果您的函数位于两个不同的文件中,它将无法工作
要解决此问题,请在.cpp
文件中定义此变量,并在头文件中将其声明为外部文件。如果使用静态int***solns
,则必须为数组分配内存。在这种情况下,所分配的只是一个指向内存地址的指针的空间,该内存地址包含一个int**
。如果使用static int solns[][][]
则需要指定一个大小,例如static int solns[4][5][3]
如果使用static int***solns
则必须为数组分配内存。在这种情况下,所分配的只是一个指向内存地址的指针的空间,该内存地址包含一个int**
。如果使用<代码>静态int SOL[]][]/Cord>,您需要给出一个大小,如<代码>静态int SOLNS [ 4 ] [ 5 ] [ 3 ] < /> > /p>我看到您所说的,但是这两个函数都在同一个文件中,所以我不认为适用。CPP文件是C++的,而不是CI看到的,但是两个函数都在同一个文件中,所以我不认为这是适用的。CPP文件是C++的,而不是CK,请显示一个最小的代码示例来复制你的问题。MichaelFoukarakis好了,完成了。希望它在没有附加其余代码的情况下有一定的意义。您没有做过像定义具有完全相同名称的函数局部变量这样愚蠢的事情,是吗?这不是您正在声明的3D整数数组。这是对这种情况的模拟,如果可以的话,在现代C语言中应该避免这种情况,并且只分配连续数组。您是否为soln分配过内存?我可以看到您为solns[k]和solns[k][l]分配了资源,但从来没有为solns本身分配过资源。请给出一个复制您的问题的最小代码示例。@MichaelFoukarakis好的,完成了。希望它在没有附加其余代码的情况下有一定的意义。您没有做过像定义具有完全相同名称的函数局部变量这样愚蠢的事情,是吗?这不是您正在声明的3D整数数组。这是对这种情况的模拟,如果可以的话,在现代C语言中应该避免这种情况,并且只分配连续数组。您是否为soln分配过内存?我可以看到您为solns[k]和solns[k][l]分配资源,但从未为solns本身分配资源。
solns[k] = realloc(solns[k],sizeof(solns[k])/sizeof(int*)+sizeof(int*));
solns[k][l] = realloc(solns[k][l],sizeof(int)*4*sC);
for(i=0;i<sC*4;i++)
{
solns[k][l][i] = row[i];
}
l++;
if(solns[i][j][m*4+1]!=solns[i+1][n][m*4+2])
break;