2013-01-19 301 views
1

我對程序編程非常陌生,所以我不確定我的代碼是壞的還是在Visual Studio中做錯了。用gcc編譯的代碼不會在visual studio 2012編譯

所以我有這樣的代碼應該打印一個整數,打印它在內存中的位置,通過內存更改它的值,然後打印新的整數以及它在內存中的位置。

它編譯和運行良好,通過cmd與gcc,但不是在Visual Studio中。

#include <stdio.h> 

int main(){ 
    int a = 4; 
    printf("Integer is: %d\n", a); 
    printf("Integer is stored at: %p in memory\n", a); 
    int *pointer = &a; 
    *pointer = 3; 
    printf("Integer is now: %d at %p in memory\n",a,*pointer); 
    getchar(); 
    return 0; 
} 

視覺工作室給了我這些錯誤,當我嘗試編譯並運行:

9號線:錯誤C2065: '指針':未聲明的標識符

9號線:錯誤C2100:非法間接

線11:錯誤C2065:指針':未聲明的標識符

線11:錯誤C2100 :非法間接

+1

所以你說的是,C的兩個不同版本是不同的?沒有一個「C」......有幾個不同的版本/迭代規格,每個版本都有自己的功能。 –

+2

這可能有所幫助:http://stackoverflow.com/questions/14376511/cannot-declare-variable-at-all-with-windows-driver-kit-build-environment/14377441#14377441 – hmjd

+0

Visual Studio可能是抱怨你'不要遵循ANSI C標準:你不能在任何語句下面聲明任何新的變量。如果你想,切換到C99或C++。 – Orwell

回答

5

Visual Studio C編譯器不支持C99,特別是能夠在塊中的任何位置聲明變量。 GCC支持C語言的幾個修訂版本。 IIRC,通過-std = c89作爲gcc的標誌將會標記這些。

1

printf("Integer is stored at: %p in memory\n", a); 您需要將地址a&a中的地址一致。

printf("Integer is now: %d at %p in memory\n",a,*pointer); 您無需取消pointer即可獲取地址。 使用pointer,不*pointer

如果你與C89(我認爲)以上的編譯器編譯,指針的聲明將被移動到一個塊的頂部。你無法在舊版C.聲明中的代碼中間變量

+0

對-1的解釋在哪裏? – JimR

+1

你對自己說的話是正確的,我也不明白-1。從我+1。 – NlightNFotis

1

隨着VS2012/C,你需要以你想要做什麼,不幸的是,編譯器不支持的聲明在中間

int main(){ 
    int a = 4; 
    printf("Integer is: %d\n", a); 
    printf("Integer is stored at: %p in memory\n", a); 
    { 
     int *pointer = &a; 
     *pointer = 3; 
     printf("Integer is now: %d at %p in memory\n",a,*pointer); 
    } 
    getchar(); 
    return 0; 
} 
添加塊

或者您可以強制通過指定文件上的/TP開關將.c文件編譯爲.cpp文件。

2

我想你應該首先聲明該函數的頂部的變量,並在打印內存地址與%p,你應該給變量要打印

的地址試試這個

int main() 
{ 
    int a = 4; 
    int *pointer=&a; 
    printf("Integer is: %d\n", a); 
    printf("Integer is stored at: %p in memory\n",&a); 
    *pointer = 3; 
    printf("Integer is now: %d at %p in memory\n",a,pointer); 
    getchar(); 
    return 0; 
}