我正在尝试将一个二维数组传递给一个函数,但它始终抛出此错误。我的代码如下:
void initialize_centroids(int *,int,int);(Initialization)
initialize_centroids(centroid[0],noofcentroids,newnoofvar);(inside my main)
void initialize_centroids(int *carray,int p,int q)
{
int i,j;
for(i=0;i<p;i++)
{
for(j=0;j<q;j++)
{
carray[i][j]=i;
}
}
return;
}
答案 0 :(得分:1)
您正在传递指向int(int*
)的指针,但您尝试使用两个下标。它是2D阵列吗?然后参数需要是指向int的指针的指针:int**
void initialize_centroids(int**, int, int);
int centroid[][] = .... // wherever this comes from
initialize_centroids(centroid, noofcentroids, newnoofvar);(inside my main)
void initialize_centroids(int** carray, int p, int q)
{
int i,j;
for(i=0;i<p;i++)
{
for(j=0;j<q;j++)
{
carray[i][j]=i;
}
}
return;
}
答案 1 :(得分:1)
传入时不要取消引用centroid
。这样做只会通过你的第一行。这样做:
initialize_centroids( centroid, noofcentroids, newnoofvar );
然后你需要在这里使用正确的类型:
void initialize_centroids( int **carray, int p, int q )
您的数组可能是int**
。这意味着它是一个指向内存中包含int*
指针数组的位置的指针。这些指针中的每一个(我假设)都引用了已分配一行数组的内存。
现在,一旦您通过carray[i]
获得其中一个指针,您就选择了行i
。您现在有一个int*
,这意味着它指向一个int
数组。
最后,carray[i][j]
从第j
行的i
列中选择一个特定的整数。
[编辑]
关于可能出现问题的理论......你可能不会在动态意义上分配2D数组,或者实际上它可能是一维数组而你应该使用步长等。这是一个解决方案,您可以使用它来动态分配2D数组,并将其编入索引为carray[i][j]
。
注意:由于对齐问题,有些人过去对我这种方法感到不满,但我从未遇到过问题。我想他们只是脾气暴躁的一天。对于那些担心对齐的人来说,很容易对此进行调整,但对于这个例子来说太复杂了。
int** allocate_array2d( int rows, int cols )
{
int i, **arr, *data;
arr = (int**)malloc( rows * sizeof(int*) + rows*cols*sizeof(int) );
data = (int*)(arr + rows);
for( i = 0; i < rows; i++ ) {
rows[i] = data;
data += cols;
}
return arr;
}
void free_array2d( int** arr ) {
free((void*)arr);
}
现在,在你的主要:
int** centroid = allocate_array2d( noofcentroids, newnoofvar );
initialize_centroids( centroid, noofcentroids, newnoofvar );
[更多...]
好的。是的,我分配了像这个质心[100] [100]的记忆--Bobby 11 分钟前
在这种情况下,您应该声明:
void initialize_centroids( int carray[100][100], int p, int q )
{
//...
}
无需使用我的动态数组示例