C程序:新手试图将2D字符串数组传递给函数

在C中编程(使用-std = C89),并尝试将字符串数组传递给函数时遇到错误。

main() ,我声明了数组如下:

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

my_function ,我已将数组声明为:

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

我收到这个错误:

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

二维字符数组仍然是一个字符数组,并且将具有char *my_array的原型。 所以只需将您的函数定义更改为:

 void my_function(char *my_array) 

请注意,这将使arrays变平。 有不同的技术来保持arrays的二维性,一种简单的方法是使用这个替代原型:

 void my_function(char my_array[][COLS]) 

这将在传递时保留数组的维度。

char **my_array表示完全不同的东西(例如,指向数组的指针)。

您可以将char[]变量作为char*传递,但不能将char[][]作为char**传递。 当您使用参数char** my_array ,您说*my_array类型为’pointer-to-char’。 实际上,它有’array-of-char’。 如果使用声明为char* x[];的数组,则可以使用char**类型的参数char* x[]; 每个元素都是一个指向动态分配缓冲区的指针。

使用多维数组时,您必须记住,您只能用*替换数组的“最内层”维度。 如果您尝试抽象出多个维度,编译器将不知道如何进行数组运算。 如果需要一个在所有维度中采用任意大小的多维数组的函数,则将该数组作为void*传递,将数组维度作为附加参数传递,然后手动执行所有数组算术。

您可以使用具有多维数组的函数签名,即:

 my_fun(char my_array[][COLS]); 

你可能会得到一些:

关于C中的指针和数组的教程 ,请参阅第7章。


编辑:我怀疑你正在尝试做一些你不需要的事情。

 #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; } 

输出示例:

 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 <---------+