2013-01-19 310 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; 
}