1

以下の私のコードで何が間違っていますか?

Dev C++ コンパイラでコンパイルすると、エラーや警告は表示されません。しかし、プログラムを実行した後、実行エラーと次の戻り値のテキストがあります。

プロセスは 5.1 秒後に戻り値 3221225477 で終了
しました。続行するには任意のキーを押してください。. .

何が間違っているのですか?

デバッグ機能を使用すると、次の行でエラーが発生します。

printf("Value of (*pointerToMyOwnStructPointer)->a = %d\n", (*pointerToMyOwnStructPointer)->a);

私のコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int a;
    int b;
}myIntegers_t;

int main (void)
{
    myIntegers_t *myOwnStructPointer = NULL;
    myIntegers_t **pointerToMyOwnStructPointer = NULL;

    myOwnStructPointer = (myIntegers_t*)malloc(sizeof(myIntegers_t));

    if (myOwnStructPointer > 0)
    {   
        myOwnStructPointer->a = 2;
        myOwnStructPointer->b = 8;

        printf("Value of myOwnStructPointer->a = %d\n", myOwnStructPointer->a);
        printf("Value of myOwnStructPointer->b = %d\n", myOwnStructPointer->b);

        pointerToMyOwnStructPointer = (myIntegers_t**)myOwnStructPointer;

        printf("\n");
        printf("Value of (*pointerToMyOwnStructPointer)->a = %d\n", (*pointerToMyOwnStructPointer)->a);
        printf("Value of (*pointerToMyOwnStructPointer)->b = %d\n", (*pointerToMyOwnStructPointer)->b);  
    }
    else
    {
        return -1;
    }

    return 0;
}
4

5 に答える 5

3

あなたのコードで、

 pointerToMyOwnStructPointer = (myIntegers_t**)myOwnStructPointer;

は非常に間違っています。それをに変更する必要があります

pointerToMyOwnStructPointer = &myOwnStructPointer;

期待される動作を取得します。

詳しく説明すると、

  • myOwnStructPointer型へのポインタです。
  • pointerToMyOwnStructPointerポインターからポインターへの型です。

それらは同等ではありません。どちらもポインターであるという理由だけで、ある型の値を別の型に単純にキャストして、それが機能することを期待することはできません。キャストが間違っています (必須ではありません)。そう、

  • キャストしない
  • コンパイラの警告を有効にします。

ほとんどの場合、少なくとも警告によって、コンパイラはあなたを救います。


注:の戻り値とファミリをキャストしない理由を参照してください。malloc()C

于 2015-07-15T11:11:04.133 に答える
1

割り当てにそのキャストがない場合、エラーまたは警告が表示されます

pointerToMyOwnStructPointer = (myIntegers_t**)myOwnStructPointer;

これmyOwnStructPointerは、構造体pointerToMyOwnStructPointerへのポインターであるが、構造体へのポインターへのポインターであり、これら 2 つの型は完全に互換性がないためです。

コンパイラは次のように解釈します。

+-----------------------------+ +--------------+ +-- ------+
| | ポインターToMyOwnStructPointer | -> | いくつかのアドレス | -> | 構造体 |
+-----------------------------+ +--------------+ +-- ------+

したがって、割り当てを行ってから使用するpointerToMyOwnStructPointerと、ポインターを指していないため、未定義の動作が発生します。


ここでの教訓は、コンパイラのエラーや警告を解決するために型キャストを挿入することはほとんどないということです。エラーや警告には理由があります。警告は、未定義の動作につながる可能性のある疑わしいことを行っていることを示していることがよくあります。

于 2015-07-15T11:15:47.897 に答える
0

改善提案のみ

また、正しいmalloc割り当て方法は

myIntegers_t * myOwnStructPointer = malloc(sizeof(myIntegers_t));
if (myOwnStructPointer == NULL)
    return 1;

. . .    // else do something with myOwnStructPointer;
于 2015-07-15T11:14:16.297 に答える