[英]Passing 2-d array to a function in C
我正在嘗試創建一個函數,該函數根據變量名稱以及行數和列數(在本例中為 n)來初始化隨機二維方陣。 此代碼返回“分段錯誤”錯誤,我不知道為什么。 我試過在函數 initM 中的 if-else 中使用 &,但隨后返回“錯誤:左值需要作為賦值的左操作數”有誰知道如何使它工作?
void initM (int n, int **matrix){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i == j) matrix[i][j] = 101;
else matrix[i][j] = (rand() % 101);
}
}
}
void main (int argc, char *argv[]){
int n = atoi(argv[1]);
int **matrix = (int **)malloc(n*sizeof(int));
for(int i = 0; i < n; i++) matrix[i] = (int *)malloc(n*sizeof(int));
initM(n, matrix);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
printf("%d ", matrix[i][j]);
}
printf("\n");
}
for (int i = 0; i < n; i++) free(matrix[i]);
free(matrix);
}
int **matrix = (int **)malloc(n*sizeof(int));
它應該是
int **matrix = malloc(n*sizeof(int*));
在您的架構中, sizeof(int)
和sizeof(void*)
的值不同。
不需要轉換 malloc 的輸出,因為 void* 可以像任何其他指向對象的指針一樣正確地表現。
int **matrix = (int **)malloc(n*sizeof(int));
主要問題是sizeof (int)
與系統上的sizeof (int *)
,因此您沒有分配足夠的空間。 上面的調用可以改寫為
int **matrix = malloc( n * sizeof *matrix );
強制轉換是不必要的1 ,而sizeof *matrix == sizeof (int *)
2 。
同樣,您可以將每個matrix[i]
分配為
matrix[i] = malloc( n * sizeof *matrix[i] ); // sizeof *matrix[i] == sizeof (int)
您應該始終檢查malloc
、 calloc
或realloc
調用的結果。 雖然失敗很少見,但它們可能會發生:
int **matrix = malloc( n * sizeof *matrix );
if ( matrix )
{
for ( i = 0; i < n; i++ )
{
matrix[i] = malloc( n * sizeof *matrix[i] );
if ( matrix[i] )
// do stuff
}
}
最終 nit- main
返回int
,而不是void
。 除非您的編譯器專門將void main( int, char ** )
為有效簽名,否則使用它會調用未定義的行為。 您的代碼可能運行得很好,但在某些(公認的舊的或古怪的)平台上,將main
鍵入為void
會導致問題。
sizeof
是一個operator ,而不是一個函數 - 只有在操作數是類型名稱時才需要括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.