4

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

4

3 回答 3

3

一个二维字符数组仍然是一个字符数组,其原型为char *my_array. 因此,只需将您的函数定义更改为:

void my_function(char *my_array)

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

void my_function(char my_array[][COLS])

传递时将保留数组的尺寸。

char **my_array意味着完全不同的东西(例如指向数组的指针)。

于 2012-04-10T01:51:33.390 回答
2

您可以将char[]变量作为 a传递char*,但不能将 achar[][]作为 a传递char**。当您使用参数char** my_array时,您是在说它的*my_array类型为'pointer-to-char'。实际上,它具有“字符数组”类型。char**如果您使用声明为 like 的数组char* x[];并且每个元素都是指向动态分配缓冲区的指针,您将使用类型参数。

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

于 2012-04-10T01:56:39.290 回答
1

您可以有一个带有多维数组的函数签名,即:

my_fun(char my_array[][COLS]);

你可能会从中得到一些:

C 中指针和数组的教程,请参见第 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 <---------+
于 2012-04-10T02:10:03.993 回答