程序用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 回答
我会说,明显缺乏对指针的理解是
ptr
实际上指向未正确分配的内存(如果有的话),并且您遇到了未定义的行为 . The issue is elsewhere in the program ,在调用some_function
之前 .另外,分配和复制数据的正确方法是:
但是,除非结构是巨型的,否则当你可以在堆栈上执行它时,在堆上执行它有点愚蠢:
我不明白为什么印刷品有差异 . 你能展示打印代码吗?无论如何,malloc导致内存泄漏 . 你不应该为'cpy'分配内存,因为指针赋值不是浅拷贝,你只需通过在'cpy'中存储该内存开头的地址,使'cpy'指向相同的内存'ptr'点( cpy主要是存储地址的32/64位值,如果是malloc,它将存储你分配的内存部分的地址)