二維數組傳參數問題

 

棧,和堆的二維數組是不同的。數組

好比int a[n][m] 的一個變量,傳入一個函數void func(int **a)就會有編譯告警,緣由爲:棧上分配的二維數組數組名int array[n][m]的真實類型是int [ ][ ],在做爲右值時才被轉化爲(int *array)[N] ,和int **是不一樣的。把前者進行強制轉換爲後者,在函數中對元素操做也會致使段錯誤函數

warning: incompatible pointer types passing 'int [n][m]' tospa

      parameter of type 'int **' [-Wincompatible-pointer-types]code

#include <stdio.h> #include <stdlib.h> #include <assert.h>
int func(int *array, int m, int n) { int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) printf("\t%d", *(array +i*n +j)); printf("\n"); } return 0; } int main(int argc,char** argv) { int m=3,n=3,i; int array[][3] = {{1,2,3},{4,5,6},{7,8,9}}; func(*array,m,n); return 0; }
#include <stdio.h> #include <stdlib.h> #include <assert.h>
int func(int *array, int m, int n) { int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) printf("\t%d",*(array+i*n+j)); printf("\n"); } return 0; } int main(int argc,char** argv) { int m,n,i; int *array; assert(argc == 3); m = atoi(argv[1]); n = atoi(argv[2]); array = (int*)malloc(m*n*sizeof(int)); for(i=0;i<m*n;i++) array[i] = i; func(array,m,n); return 0; }

上面兩個狀況均可以使用這種形式,不過注意第一種入參是數組首元素的地址。blog

相關文章
相關標籤/搜索