程序用C编写,并用GCC编译。
我试图帮助一个朋友,他试图使用尝试(浅层)复制传递到函数中的值。他的the值是一个包含基元和指针(没有数组或缓冲区)的结构。由于不确定malloc是如何工作的,他使用了类似于以下操作的方法:
void some_function(int rand_params,some_STRUCT_TYPEDEF*ptr){SOME_STRUCT_TYPEDEF*cpy;cpy=malloc(大小为(SOME_STRUCT_TYPEDEF));//这句话有什么不同?!?!?cpy=ptr;//无论如何都会覆盖cpy,对吧?//在记录为char*的结构中打印一个值,//抱歉,现在找不到文档}
我告诉他malloc不应该影响节目,所以让他把它评论掉。令我惊讶的是,malloc导致了与注释掉malloc的实现不同的输出(带有一些预期的字符串)(打印我们的垃圾值)。传递给这个函数的指针来自其他库函数,我目前还没有相关文档。我能假设的最好的情况是,指针指向的值实际上是一个缓冲区(在堆栈上)。但我仍然不明白malloc是如何造成这样的差异的。有人能解释一下malloc是如何造成差异的吗?
我想说,对指针明显缺乏理解是ptr
实际指向未正确分配的内存的原因(如果有的话),并且您正在经历未定义的行为在调用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;
我不明白为什么打印中有差异。你能出示打印代码吗?无论如何,malloc会导致内存泄漏。您不应该为"cpy"分配内存,因为指针分配不是浅拷贝,您只需将该内存的起始地址存储在"cpy(cpy大多是存储地址的32/64位值,在malloc的情况下,它将存储您分配的内存段的地址)中,就可以使"cpy)"指向同一内存"ptr"点