[英]C - passing arrays through functions
我有以下...
void keySorter(char (*keys)[NumberOfKeys][LengthOfKeys]) {}
int main ()
{
char keys[NumberOfKeys][LengthOfKeys] = {};
keySorter (&keys);
}
所以,我有這個,它可以很好地編譯,但是我正在找回我想要的東西。 keys [] []已用= {};
初始化= {};
所以它是空的,但是一旦在函數內部,就應該充滿了東西。
第一個元素被放到函數中,其余的去……? 我看到了STRCPY函數,該函數將數據放入keys [] []中,並且具有正確的源值,但目標值似乎是垃圾(或至少它組成了看起來像垃圾的字符)。
strcpy(*keys[i], "BLAH");
那是功能的另一部分。
在keySorter
內部, keys
是指向char
數組的數組的指針。 這意味着要獲取與strcpy
一起使用的char
數組,您需要取消引用指針,然后使用數組訪問來選擇一個數組。
例如
strcpy((*keys)[i], "test");
您不能使用*keys[i]
因為優先級規則意味着首先應用[]
並且keys
不是指向數組第一個元素的指針,而是指向數組本身的指針。
順便說一句,對於您正在執行的操作,將keySorter
聲明為采用指向chars數組的指針,然后使指向指針的普通數組發生在函數的參數上的行為更為常規。
void keySorter(char keys[][LengthOfKeys]);
要么
void keySorter(char (*keys)[LengthOfKeys]);
在這種情況下,可以簡單地做strcpy(keys[i], "blah")
因為keys
是一個指針到的數組的數組char
。
所謂的:
int main ()
{
char keys[NumberOfKeys][LengthOfKeys] = {};
keySorter(keys);
}
您聲明了自動變量keys
但未在其中添加任何內容,因此它將包含垃圾值。
是的,您正在正確粘貼數組,因為調用和聲明的函數參數類型匹配。 但是您要傳遞一個指向char數組的數組的指針,而不是指向該數組的第一個char元素的簡單指針。 也許您應該這樣:
void keySorter(char keys[NumberOfKeys][LengthOfKeys])
{...}
int main(void)
{
char keys[NumberOfKeys][LengthOfKeys];
keySorter(keys);
}
這使您可以非常簡單地訪問數組元素:
for (int i = 0; i < NumberOfKeys; i++)
{
for (int j = 0; j < LengthOfKeys; j++)
{
... keys[i][j] ...
}
}
附錄
添加一個顯式的初始化器值足以將數組初始化為全零(即所有'\\0'
0'char值):
char keys[NumberOfKeys][LengthOfKeys] = { 0 };
這是有效的(C99)代碼-如果窗口的寬度超過100列,則輸出會整齊(如果窗口狹窄,則將32列調整為較小的數字):
#include <stdio.h>
enum { NumberOfKeys = 20, LengthOfKeys = 32 };
static void keySorter(char (*keys)[NumberOfKeys][LengthOfKeys])
{
size_t k = 0;
for (size_t i = 0; i < NumberOfKeys; i++)
for (size_t j = 0; j < LengthOfKeys; j++)
(*keys)[i][j] = ++k & 0xFF;
}
static void dumpKeys(char keys[NumberOfKeys][LengthOfKeys])
{
for (size_t i = 0; i < NumberOfKeys; i++)
{
for (size_t j = 0; j < LengthOfKeys; j++)
printf("%02X ", keys[i][j] & 0xFF);
putchar('\n');
}
}
int main(void)
{
char keys[NumberOfKeys][LengthOfKeys] = {};
printf("Before:\n");
dumpKeys(keys);
keySorter(&keys);
printf("After:\n");
dumpKeys(keys);
}
注意用於訪問在陣列的符號之間的關鍵區別keySorter()
相比dumpKeys()
在第一種方法中,因為傳遞了指向2D數組的指針,所以訪問該數組的代碼必須首先使用(*keys)[i][j]
取消對該指針的引用,而在第二種方法中,直接傳遞該數組,而直接傳遞該數組訪問符號keys[i][j]
可以。
當我使用(MacOS X 10.6.5上的GCC 4.2.1)進行編譯時,使用:
gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition xx.c -o xx
顯示的代碼可以干凈地編譯。 當我嘗試在keySorter()
使用keys[i][j]
時,它抱怨“錯誤:賦值中的類型不兼容”。
您還可以修改keySorter()
以使用strcpy()
(當然,您也應該#include <string.h>
):
static void keySorter(char (*keys)[NumberOfKeys][LengthOfKeys])
{
for (size_t i = 0; i < NumberOfKeys; i++)
strcpy((*keys)[i], "BLAH");
}
在索引到數組之前,您仍然必須取消對數組的指針的引用。
如果/何時寫:
strcpy(keys[i], "BLAH");
那么您應該收到編譯器警告(如果您沒有更好的編譯器,或者至少要弄清楚如何使您的編譯器發出大量警告),但是keys[0]
的值是keys
指向的一組數組,然后keys[1]
是第二個數組, keys[2]
是第三個數組,依此類推。 指針的衰減可能足以使您最終在每個數組的第一行上寫BLAH,但是由於沒有在主程序中分配足夠的數組,您最終會遇到核心轉儲或其他此類問題。
keys已經是一個指針,因此您不必執行此操作keySorter(&keys); 只放keySorter(鍵);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.