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