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

文字の 2 次元配列は依然として文字配列であり、 のプロトタイプを持ちchar *my_arrayます。したがって、関数定義を次のように変更してください。

void my_function(char *my_array)

これにより配列が平坦化されることに注意してください。配列の 2 次元性を維持するためのさまざまな手法があります。簡単な方法は、この代替プロトタイプを使用することです。

void my_function(char my_array[][COLS])

渡されたときに配列の次元を保持します。

char **my_arrayはまったく異なるものを意味します (たとえば、配列へのポインター)。

于 2012-04-10T01:51:33.390 に答える
2

char[]変数を として渡すことはできますが、 aを としてchar*渡すことはできません。引数 を使用する場合、タイプが「pointer-to-char」であると言っています。実際には、「array-of-char」型です。同様に宣言された配列を使用していて、各要素が動的に割り当てられたバッファーへのポインターである場合は、型の引数を使用します。char[][]char**char** my_array*my_arraychar**char* x[];

多次元配列を操作する場合、配列の「最も内側」の次元のみを に置き換えることができることに注意する必要があります*。複数の次元を抽象化しようとすると、コンパイラは配列演算を行う方法を認識できません。すべての次元で任意のサイズの多次元配列を受け取る関数が必要な場合は、配列を としてvoid*渡し、配列の次元を追加の引数として渡し、すべての配列演算を手動で行います。

于 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 に答える