簡體   English   中英

C-通過函數傳遞數組

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

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