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

时间:2012-04-10 01:49:02

标签: c

使用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]

3 个答案:

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