不要去參考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
行一個特定的整數。
[編輯]
理論什麼可能是想錯了......你不可以在動態意義上分配一個二維數組,或者實際上它可能是一維數組,你應該使用跨度等。這裏有一個解決方案,您可以使用它動態分配二維數組,並將其索引爲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我分配的內存這樣的心[100] [100] - Bobby 11 分鐘前
在這種情況下,你應該聲明:
void initialize_centroids(int carray[100][100], int p, int q)
{
//...
}
沒必要用我的動態數組例如
「拋出這個錯誤所有的時間」?你需要做的第一件事(特別是有人在做CS大師時)是理解編譯時錯誤的不同之處 - 它不是「拋出」的,當然如果你還沒有完全消除錯誤和運行時錯誤。當然'int *'不是「一個二維數組」。 –