1

我正在学习 C 并且我这样做了(下面的代码,我不明白为什么我得到的程序返回值类似于 -1073740940 而它应该是 0

#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;

这将为 myVertexPtr 分配 myVertex 的地址,该地址位于堆栈中。您稍后将尝试释放它。我很惊讶,你没有得到一个段错误。

free 应该只为 malloc/calloc 返回的地址调用。您的代码将导致未定义的行为。

于 2012-12-11T10:29:29.993 回答
0

myVertexPtr = &myVertex;

如上所示,如果你想为 myVertexPtr 和 myVertex 共享公共内存,你需要 mot 使用 malloc。

现在您的问题是,当您添加 free() 语句时,您会得到奇怪的返回值。那是因为已经通过分配 myVertexPtr = &myVertex; 更改了 myVertexPtr 的内存指针;

因此,当您添加 free() 语句时,它会尝试释放不在堆中的内存,这就是您得到奇怪返回值的原因。

删除 malloc 和 free 语句,您的程序应该可以正常工作。希望能帮助到你.....

于 2012-12-11T11:01:31.940 回答