3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是將數(shù)組傳遞給函數(shù)的語(yǔ)法的怪癖。
實(shí)際上,無法在C中傳遞數(shù)組。如果您編寫的語(yǔ)法看起來應(yīng)該通過數(shù)組,那么實(shí)際發(fā)生的是傳遞指向數(shù)組第一個(gè)元素的指針。
由于指針不包含任何長(zhǎng)度信息,因此[]
實(shí)際上忽略了函數(shù)形式參數(shù)列表中的內(nèi)容。
允許這種語(yǔ)法的決定是在20世紀(jì)70年代做出的,并且自從......以來引起了很大的混亂。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
忽略第一個(gè)維度的長(zhǎng)度,但需要額外維度的長(zhǎng)度以允許編譯器正確計(jì)算偏移量。在下面的示例中,foo
函數(shù)傳遞指向二維數(shù)組的指針。
#include <stdio.h>void foo(int args[10][20]){ printf("%zd\n", sizeof(args[0]));}int main(int argc, char **argv){ int a[2][20]; foo(a); return 0;}
[10]
忽略第一個(gè)維度的大小; 編譯器不會(huì)阻止你索引結(jié)束(請(qǐng)注意,正式需要10個(gè)元素,但實(shí)際只提供2個(gè)元素)。但是,第二個(gè)維度的大小[20]
用于確定每一行的步幅,這里,形式必須與實(shí)際匹配。同樣,編譯器也不會(huì)阻止您索引第二個(gè)維度的末尾。
從數(shù)組基址到元素的字節(jié)偏移量由下式args[row][col]
確定:
sizeof(int)*(col + 20*row)
請(qǐng)注意,如果col >= 20
,那么您將實(shí)際索引到后續(xù)行(或整個(gè)數(shù)組的末尾)。
sizeof(args[0])
,80
在我的機(jī)器上返回sizeof(int) == 4
。但是,如果我嘗試接受sizeof(args)
,我會(huì)得到以下編譯器警告:
foo.c:5:27: warning: sizeof on array function parameter will return size of 'int (*)[20]' instead of 'int [10][20]' [-Wsizeof-array-argument] printf("%zd\n", sizeof(args)); ^foo.c:3:14: note: declared herevoid foo(int args[10][20]) ^1 warning generated.
在這里,編譯器警告它只會(huì)給出數(shù)組已經(jīng)衰減的指針的大小而不是數(shù)組本身的大小
- 3 回答
- 0 關(guān)注
- 854 瀏覽
添加回答
舉報(bào)