C静态主返回值0在使用之前的free(someUnrelatedPointer)后发生变化?

C静态主返回值0在使用之前的free(someUnrelatedPointer)后发生变化?,c,windows,gcc,mingw,C,Windows,Gcc,Mingw,我在学习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; struc

我在学习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;
}
#包括
#包括//用于使用malloc;
结构顶点{
int x;
int-y;
intz;
};
int main(){
int-ret=0;
结构顶点myVertex;
结构顶点*myVertexPtr=malloc(sizeof(*myVertexPtr));
myVertexPtr=&myVertex;
myVertex.x=1;
y=2;
myVertex.z=3;
printf(“%d\n”,myVertexPtr->x);
printf(“%d\n”,myVertexPtr->y);
printf(“%d\n”,myVertexPtr->z);
getchar();
free(myVertexPtr);//包含这一行时,我会得到奇怪的程序返回值(以及“此程序已停止正常工作windows错误”)
//如果不包括这一行,它返回的结果很好,但我的印象是,自由指针是一种很好的做法
返回0;
}
我正在使用MinGW GCC编译这一行:

myVertexPtr = &myVertex;
myVertexPtr = &myVertex;
覆盖由
malloc()
返回的指针,以便将错误的值传递到
free()
,这会导致错误。它还会导致内存泄漏,这在更长期运行的程序中可能是一个问题。不要这样做

如果要处理堆上的顶点,只需将其删除即可:

myVertexPtr = malloc(sizeof *myVertexPtr);
myVertexPtr->x = 1;
myVertexPtr->y = 2;
myVertexPtr->z = 3;
如果希望有一个指向堆栈上顶点的单独指针,请删除
malloc()

这一行:

myVertexPtr = &myVertex;
myVertexPtr = &myVertex;
覆盖由
malloc()
返回的指针,以便将错误的值传递到
free()
,这会导致错误。它还会导致内存泄漏,这在更长期运行的程序中可能是一个问题。不要这样做

如果要处理堆上的顶点,只需将其删除即可:

myVertexPtr = malloc(sizeof *myVertexPtr);
myVertexPtr->x = 1;
myVertexPtr->y = 2;
myVertexPtr->z = 3;
如果希望有一个指向堆栈上顶点的单独指针,请删除
malloc()

这将使用myVertex的地址为myVertex分配myVertexPtr,它位于堆栈上。您稍后将尝试释放它。 我很惊讶,你没有出现seg故障

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

这将使用myVertex的地址为myVertex分配myVertexPtr,它位于堆栈上。您稍后将尝试释放它。 我很惊讶,你没有出现seg故障


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

myVertexPtr=&myVertex

如上所示,如果您想为myVertexPtr和myVertex共享公共内存,则不需要使用malloc

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

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


删除malloc和free语句,您的程序应该可以正常运行。希望对您有所帮助。…

myVertexPtr=&myVertex

如上所示,如果您想为myVertexPtr和myVertex共享公共内存,则不需要使用malloc

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

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

删除malloc和free语句,您的程序应该可以正常运行。希望对您有所帮助