传入时不要取消引用centroid
。这样做只会通过你的第一行。做这个:
initialize_centroids( centroid, noofcentroids, newnoofvar );
那么你需要在这里使用正确的类型:
void initialize_centroids( int **carray, int p, int q )
你的数组大概是一个int**
. 这意味着它是一个指向内存中包含指针数组的位置的int*
指针。这些指针中的每一个(我假设)都引用了已分配给数组的一行的内存。
现在,一旦您通过执行获得这些指针之一,carray[i]
您就选择了 row i
。你现在有一个int*
,这意味着它指向一个数组int
。
最后,从row 上的列中carray[i][j]
选择一个特定的整数。j
i
[编辑]
关于可能出了什么问题的理论...您可能没有在动态意义上分配二维数组,或者实际上它可能是一维数组并且您应该使用步幅等。这是您可以使用的解决方案用于动态分配二维数组,并将其索引为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 );
[更多的...]
Okay.Yes 我分配了像这样的 centroid[100][100] 的内存 – Bobby 11 分钟前
在这种情况下,您应该声明:
void initialize_centroids( int carray[100][100], int p, int q )
{
//...
}
无需使用我的动态数组示例