1

我对过程编程非常陌生,所以我不确定我的代码是否不好,或者我在 Visual Studio 中是否做错了什么。

所以我有这段代码应该打印一个整数,打印它在内存中的位置,通过内存更改它的值,然后打印新的整数以及它在内存中的位置。

它可以通过带有 gcc 的 cmd 编译并运行良好,但在 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;
}   

当我尝试编译和运行时,Visual Studio 给了我这些错误:

第 9 行:错误 C2065:“指针”:未声明的标识符

第 9 行:错误 C2100:非法间接

第 11 行:错误 C2065:“指针”:未声明的标识符

第 11 行:错误 C2100:非法间接

4

4 回答 4

5

Visual Studio C 编译器不支持 C99,尤其是能够在块中的任何位置声明变量。GCC 支持 C 语言的多个版本。IIRC,将 -std=c89 作为标志传递给 gcc 也会标记这些。

于 2013-01-19T22:07:39.547 回答
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;
}
于 2013-01-20T09:34:33.883 回答
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 的代码中间声明变量。

于 2013-01-19T22:07:58.267 回答
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文件。

于 2013-01-19T22:29:03.617 回答