2016-05-26 50 views
1

說起Ç
我知道
的C,什麼是 「無效的主要(INT ARGC,CHAR *的argv [0])」,注意argv中零

void main (int argc, char *argv[]) 

是正確的方法參數傳遞給主,
但出於好奇,我寫了

void main (int argc, char *argv[1]) 

和程序,編譯之後表現出完全相同的結果爲前一個。
究竟我在第二版中做了什麼,有人可以解釋我嗎?
在此先感謝。

+5

試着用2或3個參數執行第二個版本 –

+2

@ThomasAyoub你是什麼意思? –

回答

7
void main (int argc, char *argv[1]) 

void main (int argc, char *argv[]) 

是等價的。

argv是一個指針(char**)和main()爲其指定的大小不是字符串在argv實際尺寸 - 因爲傳遞給函數的數組被轉換成一個指針到它的第一個元素。基本上,編譯器會忽略大小值。

出於同樣的原因,你可以指定:

void main (int argc, char *argv[101]) 

,它仍然可以工作,你會期望。 閱讀代碼的人可能會感到困惑。但它是完全有效的。

相關的職位:What is array decaying?

+0

小修正。編譯器會忽略最後一個維**的大小值**。在這種情況下沒有什麼區別,但是爲了嚴謹起見,可能值得修復。 –

+0

@ShacharShemesh不完全正確。在函數foo(int array [] [16])中,它是編譯器*需要知道的最後一個維度。 –

+1

說明*最左邊的維被忽略*是毫不含糊的。 –

0

首先,C的來講,main()返回類型應該是int。 這是從C語言標準:

5.1.2.2.1計劃啓動

1名爲在程序啓動的功能被命名爲main執行聲明 此功能的原型。它應具有的int返回類型並沒有 參數來定義:

int main(void) { /* ... */ } 

或兩個參數(這裏稱爲argcargv,雖然任何人的名字,可以 使用,因爲它們是本地在聲明它們的功能):

int main(int argc, char *argv[]) { /* ... */ } 

或同等學歷;或者以某種其他實現定義的方式。

char *argv[]是有以允許多個命令行參數。雖然char *argv[0]看起來很奇怪但是有效,但通常留給你的命令行參數分析程序處理這個以編程方式。
下面是一個代碼示例表明char *argv[0]不影響命令行參數解析:

#include <stdio.h> 

int main(int argc, char *argv[0]) 
{ 
    for (int i = 0; i < argc; i++) 
     printf("%s\n", argv[i]);  
    return 0; 
} 
0

在函數參數聲明的上下文中,T a[N]T a[]都相當於T *a;他們宣佈a作爲指向T的指針。

argv的情況下,Tchar *

如果T是數組類型R [M],然後R a[N][M]R a[][M]相當於R (*a)[M];他們宣佈a作爲指向R數組的指針。

相關問題