程序用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可能会产生什么影响吗?
答案 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的情况下,它将存储你分配的内存部分的地址)