3
#include <stdio.h>

main()
{
    myfunction();
}

void* myfunction() {
    char *p;
    *p = 0;
    return (void*) &p;
}

プログラムをVisualStudioで実行すると、コンパイルできず、エラーメッセージは次のようになります。

"エラー2エラーC2040:'myfunction':'void *()'は、間接参照のレベルが' int()'と異なります"

誰かが簡単に説明できますか?

ありがとう!

4

3 に答える 3

4

関数myfunction()で使用する前に、の宣言を追加する必要があります。main()

void* myfunction(void);

int main(void)
{
    myfunction();
    return 0;
}

void* myfunction(void) {
    char *p;
    *p = 0;
    return (void*) &p;
}

それを試してみてください。

于 2013-03-04T00:58:31.243 に答える
2

あなたのプログラムには 2 つの問題があります。最初の問題は、Nan Xiao の answerで言及されている問題です。これにより、コンパイラは、あなたの呼び出しを見て、 の署名myfunctionを想定しています。int myfunction()main

2 番目の問題は、内部に不適切なレベルの間接性があることですmyfunction

void* myfunction(void) {
    char *p; // Create a pointer to a character
    *p = 0;  // Set some random location to zero
    return (void*) &p; // Take the address of the pointer to a character,
                       // and turn it into a pointer to anything
}

つまり、あなたのキャストはそれを取り込んchar **で作成しvoid *ていますが、これはおそらくあなたが望んでいたものではありません.

void ポインターにキャストされた文字ポインターを返したい場合は、キャストせずに文字ポインター自体を返します。

于 2013-03-04T01:19:05.967 に答える
0

編集:あなたのコードを読み違えました。回答が更新されました。

@Nan Xiao が指摘しているように、呼び出す前に myfunction を宣言する必要があります。コンパイラが存在すると誤って int を返すと想定することしかできません。これにより、後で苦情が発生します。

関数が最初はintを返すように「定義」されていたと不平を言っていると思いますが、今ではvoid *を返す関数が見つかりました。int には 0 レベルの間接参照があります (ポインターではありません) が、void* には 1 レベルがあります (たとえば、int を指す可能性があります)。続けて、void** には 2 つのレベルの間接参照があります (int を指す可能性のあるものを指します)。

C では、double を int に (たとえば) 安全に変換できますが、その方法を説明せずに int* を int に変換することはできません (逆参照するか、アドレスを使用する必要がありますか?)。

于 2013-03-04T00:59:01.417 に答える