【问题标题】:C static main return value of 0 changing after using free(someUnrelatedPointer) before it?使用free(someUnrelatedPointer)之前的C静态主返回值0改变了吗?
【发布时间】:2012-12-11 10:26:33
【问题描述】:

我正在学习 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 编译

【问题讨论】:

    标签: c windows gcc mingw


    【解决方案1】:

    这一行:

    myVertexPtr = &myVertex;
    

    覆盖malloc() 返回的指针,因此您将错误的值传递给free(),从而导致错误。它还会导致内存泄漏,这在更长时间运行的程序中将是一个问题。不要这样做!

    它应该被简单地删除,如果你想在堆上使用一个顶点,那么这样做:

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

    如果你想在堆栈上有一个单独的指向顶点的指针,删除malloc():

    myVertexPtr = &myVertex;
    

    【讨论】:

      【解决方案2】:
      myVertexPtr = &myVertex;
      

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

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

      【讨论】:

        【解决方案3】:

        myVertexPtr = &myVertex;

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

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

        更改了 myVertexPtr 的内存指针

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

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

        【讨论】:

          猜你喜欢
          • 2016-04-14
          • 2022-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 2016-07-08
          • 2015-08-17
          • 2016-03-22
          相关资源
          最近更新 更多