2017-05-31 52 views
2

當我多次運行時,以下代碼的輸出未定義。我想知道爲什麼輸出未定義,以及當我嘗試爲未知邊界數組賦值時會有什麼含義。C編程中未知綁定用法的數組

#include <stdio.h> 

int main() 
{ 
    int a[]= {}; 
    int num_of_elements; 
    int count = 0; 

    printf("Enter the number of elements:\n"); 
    scanf("%d",&num_of_elements); 

    printf("Enter the numbers:\n"); 
    for(count=0; count<num_of_elements; ++count) 
    { 
    scanf("%d", &a[count]); 
    } 
    printf("\n"); 

    for(count=0; count<num_of_elements; count++) 
    { 
    printf("%d, ", a[count]); 
    } 
    printf("\n"); 

    return 0; 
} 

輸出時在不同的時間運行:

Enter the number of elements: 
2 

Enter the numbers: 
1 2 

0, 0, 

Enter the number of elements: 
3 

Enter the numbers: 
1 2 3 

0, 0, 2, 

Enter the number of elements: 
4 

Enter the numbers: 
1 2 3 4 

0, 0, 2, 3, 
Segmentation fault 

Enter the number of elements: 
5 

Enter the numbers: 
1 2 3 4 5 

0, 0, 2, 3, 4, 
Segmentation fault 
+1

'的INT A [] = {};'是沒有用的 - 你必須在*知道它的大小後定義數組*。 –

+0

https://stackoverflow.com/questions/1677157/can-size-of-array-be-determined-at-run-time-in-c – rsp

+1

發佈的代碼不能編譯!它會導致編譯器輸出兩條消息:1)'5:12:警告:ISO C禁止空初始化括號[-Wpedantic]'和2)'5:7:錯誤:零或負大小數組'a''編譯時始終啓用警告。然後修復這些警告。 (對於'gcc',最低限度使用:'-Wall -Wextra -pedantic') – user3629249

回答

1

I would like to know why the output is undefined and what will be implication when I try to assign value to an array of unknown bound

變量a的大小將0,爲num_of_elements一直沒有在這一點上scanf「版,所以你不能存儲任何東西。

解決的方法是在之後聲明數組您已經從用戶讀取其大小。這意味着:

#include <stdio.h> 

int main() 
{ 
    int num_of_elements; 
    int count = 0; 

    printf("Enter the number of elements:\n"); 
    scanf("%d", &num_of_elements); 

    //define here your array 
    int a[num_of_elements]; 

    ... 

    return 0; 
} 
+0

僅當__STDC_NO_VLA__是*不被定義爲宏標識符時。 – DeiDei

+0

@DeiDei OP在他的程序中沒有提到這樣一個宏定義......這就是爲什麼我沒有提到這一點。 – Marievi

+0

嗨Marievi等人...感謝您的投入。現在清楚了,並且感謝你介紹了C11標準,它給了我一些洞察, – Vasanth

1

作爲第一個提示,當您嘗試使用-pedanticgcc編譯這一點,就會拒絕編譯:

$ gcc -std=c11 -Wall -Wextra -pedantic -ocrap.exe crap.c 
crap.c: In function 'main': 
crap.c:5:12: warning: ISO C forbids empty initializer braces [-Wpedantic] 
    int a[]= {}; 
      ^
crap.c:5:7: error: zero or negative size array 'a' 
    int a[]= {}; 
    ^

事實上,這樣一個變量的大小是0 ,所以你不能在其中存儲任何東西

儘管如此它是一個有效的語法和有其用途,例如作爲一個結構的一個 「可變數組成員」:

struct foo 
{ 
    int bar; 
    int baz[]; 
}; 

[...] 

struct foo *myfoo = malloc(sizeof(struct foo) + 5 * sizeof(int)); 
// myfoo->baz can now hold 5 integers