1

私はCを学んでおり、これを行いました(以下のコードで、0であるはずの-1073740940のようなプログラムの戻り値を取得する理由がわかりません

#include <stdio.h>
#include <stdlib.h> //For using malloc;


struct Vertex{
    int x;
    int y;
    int z;
};

int main(){
    int ret = 0;
    struct Vertex myVertex;
    struct Vertex *myVertexPtr = malloc(sizeof(*myVertexPtr));


    myVertexPtr = &myVertex;

    myVertex.x = 1;
    myVertex.y = 2;
    myVertex.z = 3;

    printf("%d\n", myVertexPtr->x);
    printf("%d\n", myVertexPtr->y);
    printf("%d\n", myVertexPtr->z);

    getchar();

    free(myVertexPtr); //When this line is included I get the strange program return    value (And, "This program has stopped working properly windows error")
                   //When this line is not included it returns fine, but I'm under the impression it is good practice to free pointers

    return 0;
}

MinGW GCC を使用してコンパイルしています

4

3 に答える 3

1

この行:

myVertexPtr = &myVertex;

によって返されたポインターを上書きするため、エラーの原因となるmalloc()間違った値を に渡します。free()また、実行時間の長いプログラムで問題となるメモリ リークも発生します。これをしないでください!

ヒープ上の頂点を操作したい場合は、単純に削除する必要があります。

myVertexPtr = malloc(sizeof *myVertexPtr);
myVertexPtr->x = 1;
myVertexPtr->y = 2;
myVertexPtr->z = 3;

スタック上の頂点への別のポインターが必要な場合は、次をドロップしますmalloc()

myVertexPtr = &myVertex;
于 2012-12-11T10:27:42.303 に答える
0
myVertexPtr = &myVertex;

これにより、スタック上にある myVertex のアドレスが myVertexPtr に割り当てられます。後で解放しようとしているもの。驚いたことに、セグ フォールトが発生していません。

free は、malloc/calloc によって返されたアドレスに対してのみ呼び出す必要があります。あなたのコードは未定義の動作を引き起こします。

于 2012-12-11T10:29:29.993 に答える
0

myVertexPtr = &myVertex;

上記のように、myVertexPtr と myVertex の両方で共通のメモリを共有する場合は、mot use malloc が必要です。

今あなたの問題は、 free() ステートメントを追加すると、奇妙な戻り値が得られることです。これは、myVertexPtr = &myVertex; を割り当てて myVertexPtr のメモリ ポインターを変更するためです。

したがって、 free() ステートメントを追加すると、ヒープ以外のメモリを解放しようとするため、奇妙な戻り値が得られます。

malloc と free ステートメントを削除すると、プログラムは正常に動作するはずです。それが役に立てば幸い.....

于 2012-12-11T11:01:31.940 に答える