簡體   English   中英

2D陣列和功能

[英]2D array and function

按照這個https://stackoverflow.com/a/3912959/1814023我們可以聲明一個接受2D數組的函數

void func(int array[ROWS][COLS]).

按照這種方式, http://c-faq.com/aryptr/pass2dary.html他們說“ 由於被調用函數不會為數組分配空間,因此不需要知道整體大小,因此行數NROWS可以省略。數組的寬度仍然很重要,因此必須保留列維NCOLUMNS(對於3維或3維以上的數組,必須保留中間的行)。

我試過了,它可以工作...請注意,我已經更改了列的大小。

#include <stdio.h>
#define ROWS 4
#define COLS 5

void func1(int myArray[][25])
{
    int i, j;

    for (i=0; i<ROWS; i++)
    {
        for (j=0; j<COLS; j++)
        {
            myArray[i][j] = i*j;
            printf("%d\t",myArray[i][j]);
        }
        printf("\n");
    }
}

int main(void)
{
    int x[ROWS][COLS] = {0};
    func1(x);
    getch();
    return 0;
}

我的問題是,為什么在CFAQ鏈接( http://c-faq.com/aryptr/pass2dary.html )中他們說“ The width of the array is still important ”? 即使我提供了錯誤的列大小。 有人可以解釋一下嗎?

這就是使用數組表示法表示指針所得到的。 人為的例子:

#include <stdio.h>

void size(int myArray[][25], int rows, int cols)
{
    printf("sizeof(int [%d][%d]) = %d\n", rows, cols, sizeof(myArray));
}

int main(void)
{
    int arr1[4][4];
    int arr2[4][5];
    int arr3[5][5];

    size(arr1, 4, 4);
    size(arr2, 4, 5);
    size(arr3, 5, 5);

    printf("sizeof(int *) = %d\n", sizeof(int *));

    return 0;
}

如果嘗試運行此命令,則即使傳遞的數組大小不同,所有4個大小都將相同。
C語言中的數組類型只是語法糖-多維數組在線性內存模型中沒有意義。 使用線性內存模型訪問簡單數組的元素時,您必須了解兩件事:基地址和索引偏移,因此可以編寫*(base+indexOffset) 要為二維數組中的元素建立索引,您必須另外了解兩件事:第一維的大小及其偏移量,因此您可以編寫*(base+dimensionSize*dimensionOffset+indexOffset) 數組符號只是為您完成所有這些復雜的數學運算,但是您仍然必須向編譯器提供所需的數據。 由您來確保數據完整性:)

當我編譯並運行您的程序時(在Ubuntu 12.04上解決了func / func1的混亂並更改了getch之后),就會發生這種情況

$ gcc crashme.c -o crashme
crashme.c: In function ‘main’:
crashme.c:23:13: warning: passing argument 1 of ‘func1’ from incompatible pointer type [enabled by default]
crashme.c:4:6: note: expected ‘int (*)[25]’ but argument is of type ‘int (*)[5]’
jamie@jamie-Ideapad-Z570:~/temp$ ./crashme 
0   0   0   0   0   
0   1   2   3   4   
0   2   4   6   8   
0   3   6   9   12  
Segmentation fault (core dumped)

如果添加一行

printf("%ld", sizeof(x));

在int x [聲明之后,您會立即看到它的大小是4 x 5 x sizeof int的大小(在我的系統上為80),因此聲明大小可用於sizeof,因此對malloc調用等有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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