我对程序编程很陌生,所以我不确定我的代码是不好的还是我在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:非法间接
答案 0 :(得分:5)
Visual Studio C编译器不支持C99,特别是能够在块中的任何位置声明变量。 GCC支持C语言的几个修订版。 IIRC,传入-std = c89作为gcc的标志也会标记这些。
答案 1 :(得分: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;
}
答案 2 :(得分: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中的代码中间声明变量。
答案 3 :(得分: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文件。