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 に答える