使用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]
答案 0 :(得分:3)
二维字符数组仍然是一个字符数组,其原型为char *my_array
。所以只需将函数定义更改为:
void my_function(char *my_array)
请注意,这会使阵列变平。有不同的技术来保持阵列的二维性,一种简单的方法就是使用这种替代原型:
void my_function(char my_array[][COLS])
传递时会保留数组的尺寸。
char **my_array
表示完全不同的东西(例如,指向数组的指针)。
答案 1 :(得分:2)
您可以将char[]
变量作为char*
传递,但不能将char[][]
作为char**
传递。当您使用参数char** my_array
时,您说*my_array
具有'指向字符'的类型。实际上,它有类型' array-of-char'。如果使用声明为char**
的数组,并且每个元素都是指向动态分配缓冲区的指针,则可以使用类型为char* x[];
的参数。
使用多维数组时,您必须记住,您只能替换"最里面的"具有*
的数组维度。如果你试图抽象出多个维度,编译器就不会知道如何进行数组运算。如果你需要一个在所有维度中采用任意大小的多维数组的函数,那么将数组作为void*
传递,将数组维度作为附加参数传递,然后手动完成所有数组运算。
答案 2 :(得分:1)
您可以使用具有多维数组的函数签名,即:
my_fun(char my_array[][COLS]);
你可能会得到一些:
A Tutorial on Pointers and Arrays in C,见I.e.第7章。
编辑:我怀疑你正在尝试做一些你不需要的事情。
#include <stdio.h>
#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 <---------+