malloc防止垃圾被打印?

时间:2013-12-06 02:53:13

标签: c pointers memory-management malloc

程序用C语言编写,并用GCC编译。

我试图帮助一个试图尝试(浅)复制传递给函数的值的朋友。他的值是一个包含基元和指针(没有数组或缓冲区)的结构。不确定malloc是如何工作的,他使用它类似于以下方式:

void some_function(int rand_params, SOME_STRUCT_TYPEDEF *ptr){
    SOME_STRUCT_TYPEDEF *cpy;
    cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF));// this line makes a difference?!?!?
    cpy = ptr;// overwrites cpy anyway, right?
    //prints a value in the struct documented to be a char*,
    //sorry couldn't find the documentation right now
}

我告诉他,malloc不应该影响程序,所以告诉他评论它。令我惊讶的是,malloc引发了一个不同的输出(带有一些预期的字符串),其中malloc被注释掉(打印我们的垃圾值)。传递给this函数的指针来自其他一些我目前没有文档的库函数。最好的我可以假设指针是一个实际上是缓冲区(在堆栈上)的值。但我仍然没有看到malloc如何导致这种差异。有人可以解释一下malloc可能会产生什么影响吗?

2 个答案:

答案 0 :(得分:3)

我会说明显缺乏对指针的理解,导致ptr实际指向未正确分配的内存(如果有的话),并且您正在体验< em>未定义的行为。 问题在程序的其他地方,在致电some_function之前。

另外,分配和复制数据的正确方法是:

SOME_STRUCT_TYPEDEF *cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF));
if (cpy) {
    *cpy = *ptr;

    // Don't forget to clean up later
    free(cpy);
}

但是,除非结构是 Giant ,否则当你可以在堆栈上执行它时,在堆上执行它有点傻:

SOME_STRUCT_TYPEDEF cpy = *ptr;

答案 1 :(得分:0)

我看不出为什么印刷品存在差异。 你能展示打印代码吗? 无论如何,malloc导致内存泄漏。你不应该为'cpy'分配内存,因为指针赋值不是浅拷贝,你只需通过在'cpy'中存储该内存开头的地址,使'cpy'指向相同的内存'ptr'点( cpy主要是存储地址的32/64位值,在malloc的情况下,它将存储你分配的内存部分的地址)