簡體   English   中英

C 程序:新手試圖將二維字符串數組傳遞到 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM