2014-07-13 44 views
0

這是一個基本的C編程問題C中的值賦值

以下聲明做了什麼?

int * doorptr, * doorlimit = is_open + NUM_DOORS; 

我認爲它分配相同的值* doorptr和doorlim所以我試圖打印下面看:

#include <stdio.h> 

#define NUM_DOORS 100 

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

    int is_open[NUM_DOORS] = { 0 }; 
    int * doorptr, * doorlimit = is_open + NUM_DOORS; 

    printf("doorptr: %p\n doorlimit: %p\n", doorptr, doorlimit); 
    printf("*doorptr: %d\n *doorlimit: %d\n", *doorptr, *doorlimit); 

    return 0; 
} 

但輸出是:

doorptr: 0xb777ec20 
doorlimit: 0xbf86c0d0 
*doorptr: 0 
*doorlimit: -1217134592 
+0

請注意,不僅''doorlimit'是UB,而且'* doorptr'('is_open + NUM_DOORS'指向'is_open'的最後一個元素之後的一個點)。 – mafso

+1

不要解除引用'doorlimit',因爲它超出了你的數組解引用它將導致未定義的行爲。 –

+0

'doorptr':不初始化指針:垃圾值。 'doorlimit':'is_open [100]'的地址':'&is_open [100]'。 '* doorptr':垃圾桶值:UB,'is_open [NUM_DOORS]':數組範圍的下一個值:垃圾桶值。 – BLUEPIXY

回答

4
int * doorptr, * doorlimit = is_open + NUM_DOORS; 

以上聲明表示

int * doorptr; 
int * doorlimit = is_open + NUM_DOORS; 

該分配僅適用於doorlimit.因此,您無法獲得兩者的相同值。

1

在此聲明

int * doorptr, * doorlimit = is_open + NUM_DOORS; 

doorptr未初始化。初始化程序僅初始化doorlimit。有趣的是,您的程序調用未定義的行爲,因爲您正在取消引用未初始化的指針doorptrdoorlimit指向單位位置。

2

這會使變量doorptr未初始化。碰巧在你的測試中,doorptr的值是指向某個地方或其他地方的有效指針,但總的來說,任何事情都可能發生。

將兩個變量初始化爲相同的值將不適合其餘的語言:它只能在這裏有意義,因爲這兩個變量碰巧具有相同的類型。

請確保在您的編譯器上激活有用的警告。任何中途體面的編譯器會警告你,如果一個變量沒有被初始化使用。

+0

您可以添加,例如Gcc需要開啓優化來做必要的分析,以查看可能未初始化變量的用法。無論如何,+1提到這可能已被編譯器回答。 – mafso