0

私はこのSOの質問このSOの質問を知っています。これの目新しさの要素は、Xcodeに焦点を当てており、voidへのポインターを逆参照するために角かっこを使用しています。

次のプログラムは、Xcode 4.5.2では警告なしでコンパイルされ、GCC 4.2では警告付きでコンパイルされます。現在、Visual Studioを使用していなくても、これはコンパイラエラーと見なされることを覚えています。また、MSDNとインターネットは同意します。 。

#include <stdio.h>

int main(int argc, const char * argv[])
{
    int x = 24;

    void *xPtr = &x;
    int *xPtr2 = (int *)&xPtr[1];

    printf("%p %p\n", xPtr, xPtr2);
}

メインの本体の3行目を次のように変更すると、次のようになります。

int *xPtr2 = (int *)(xPtr + 1);

GCCとXcodeの両方で警告なしでコンパイルされます。

GDB、特にXcode / LLVMで、この沈黙を警告またはエラーに変える方法を知りたいです。これには、関数mainがintであるが、明示的に値を返さないという事実が含まれます(ちなみに、-Wallはトリックを実行しますGDB上)。

4

1 に答える 1

0

それはまったく間違っていません...

コンパイラはポインターの大きさを知りません... a void[] ~~ void* その
ため、文字列として使用される char* は \0 で終了する必要があります

コンパイル時に「ポインタによるメモリポインタのサイズ」を決定することはできないため、その警告をオンにすることはできません

void *v = nil;
*v[1] = 0 //invalid

void *v = malloc(sizeof(int)*2);
*v[1] = 0 //valid

* SO にインラインで入力されたメモ -- 機能しないコードについては申し訳ありません

于 2013-01-04T19:50:04.587 に答える