Progtwig C: novato que intenta pasar una matriz de cadenas 2D a una función

Progtwigción en C (con -std = C89) y ejecución de errores al intentar pasar una matriz de cadenas de caracteres a una función.

En main() , he declarado la matriz de la siguiente manera:

 #define ROWS 501 #define COLS 101 void my_function( char **); ... char my_array[ROWS][COLS]; ... my_function(my_array); 

En my_function , he declarado la matriz como:

 void my_function( char **my_array ) { ... } 

Estoy recibiendo este error:

warning: passing argument 1 of 'my_function' from incompatible pointer type, note: expected 'char **' but argument is of type 'char (*)[101]

Una matriz bidimensional de caracteres sigue siendo una matriz de caracteres y tendría un prototipo de char *my_array . Tan solo cambia la definición de tu función a esto:

 void my_function(char *my_array) 

Tenga en cuenta que esto aplanará la matriz. Existen diferentes técnicas para mantener el carácter bidimensional de la matriz, una forma fácil es usar este prototipo alternativo:

 void my_function(char my_array[][COLS]) 

Que conservará las dimensiones de su matriz cuando se pasa.

char **my_array significa algo completamente diferente (puntero a una matriz, por ejemplo).

Puede pasar una variable char[] como un char* , pero no puede pasar un char[][] como un char** . Cuando usas el argumento char** my_array , estás diciendo que *my_array tiene el tipo ‘pointer-to-char’. En realidad, tiene el tipo ‘array-of-char’. Usaría un argumento de tipo char** si estuviera usando una matriz declarada como char* x[]; y cada elemento era un puntero a un búfer asignado dinámicamente.

Cuando trabaje con matrices multidimensionales, debe recordar que solo puede reemplazar la dimensión “más interna” de la matriz con * . Si intenta abstraer más de una dimensión, el comstackdor no sabrá cómo hacer la aritmética de matrices. Si necesita una función que tome una matriz multidimensional con tamaños arbitrarios en todas las dimensiones, luego pase la matriz como void* , pase las dimensiones de la matriz como argumentos adicionales y luego realice toda la aritmética de la matriz manualmente.

Puede tener una firma de función con matrices multidimensionales, es decir:

 my_fun(char my_array[][COLS]); 

Puede obtener algo de esto:

Un tutorial sobre punteros y matrices en C , consulte el capítulo 7.


Edit: Sospecho que estás tratando de hacer algo que no necesitas.

 #include  #define ROWS 501 #define COLS 101 char my_arr[ROWS][COLS]; void foo(char arr[][COLS]) { arr[44][23] = 'a'; printf("foo_1: %p\n", (void*) arr); printf("foo_2: %p\n", (void*) &arr); printf("foo_3: %p\n", (void*) arr[44]); printf("foo_4: %p\n", (void*) &arr[44]); } int main(void) { foo(my_arr); printf("my_arr[%03d][%03d] is %c\n", 44, 23, my_arr[44][23]); /* my_arr[44][23] is now 'a', (also here) */ printf("main_1: %p\n", (void*) my_arr); printf("main_2: %p\n", (void*) &my_arr); printf("main_3: %p\n", (void*) my_arr[44]); printf("main_4: %p\n", (void*) &my_arr[44]); return 0; } 

Ejemplo de salida:

 foo_1: 0x804a040 <---+ foo_2: 0xbece91f0 | foo_3: 0x804b19c <--------+ foo_4: 0x804b19c <--------+ my_arr[044][023] is a | | main_1: 0x804a040 <----+ | main_2: 0x804a040 <----+ | main_3: 0x804b19c <---------+ main_4: 0x804b19c <---------+