首页 文章

malloc防止垃圾被打印?

提问于
浏览
0

程序用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

    我会说,明显缺乏对指针的理解是 ptr 实际上指向未正确分配的内存(如果有的话),并且您遇到了未定义的行为 . The issue is elsewhere in the program ,在调用 some_function 之前 .

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

    SOME_STRUCT_TYPEDEF *cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF));
    if (cpy) {
        *cpy = *ptr;
    
        // Don't forget to clean up later
        free(cpy);
    }
    

    但是,除非结构是巨型的,否则当你可以在堆栈上执行它时,在堆上执行它有点愚蠢:

    SOME_STRUCT_TYPEDEF cpy = *ptr;
    
  • 3

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

相关问题