[英]C Program: newbie trying to pass 2D string array into a function
在 C 中編程(使用 -std=C89),並在嘗試將字符串數組傳遞到 function 時遇到錯誤。
在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
的原型。 因此,只需將您的 function 定義更改為:
void my_function(char *my_array)
請注意,這將使數組變平。 有不同的技術來保持數組的二維性,一個簡單的方法是使用這個替代原型:
void my_function(char my_array[][COLS])
這將在傳遞時保留數組的維度。
char **my_array
意味着完全不同的東西(例如,指向數組的指針)。
您可以將char[]
變量作為char*
傳遞,但不能將char[][]
作為char**
傳遞。 當您使用參數char** my_array
時,您是在說*my_array
具有類型“pointer-to-char”。 實際上,它的類型為“字符數組”。 如果您使用的是聲明為char* x[];
的數組,則可以使用char**
類型的參數; 每個元素都是指向動態分配緩沖區的指針。
使用多維 arrays 時,必須記住只能用*
替換數組的“最內層”維度。 如果您嘗試抽象出不止一維,編譯器將不知道如何進行數組運算。 如果您需要一個 function,它采用在所有維度上具有任意大小的多維數組,則將數組作為void*
傳遞,將數組維度作為額外的 arguments 傳遞,然后手動執行所有數組運算。
您可以擁有一個 function 簽名和多維 arrays,即:
my_fun(char my_array[][COLS]);
你可能會從中得到一些:
A Tutorial on Pointers and Arrays in 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;
}
示例 output:
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 <---------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.