【问题标题】:malloc preventing garbage from being printed?malloc 防止打印垃圾?
【发布时间】:2013-12-23 06:45:37
【问题描述】:

程序是用 C 语言编程并用 GCC 编译的。

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

void some_function(int rand_params, SOME_STRUCT_TYPEDEF *ptr){ SOME_STRUCT_TYPEDEF *cpy; cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF));// 这行有区别?!?!? cpy = ptr;// 无论如何都会覆盖 cpy,对吗? //打印记录为char *的结构中的值, //抱歉暂时找不到文档 }

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

【问题讨论】:

  • 基于孤立的 sn-p 代码,您是正确的:malloc 不应该有所作为。但是根据您对问题的描述,受此影响的其他地方肯定有不好的事情发生。
  • 确实需要看更多的功能。 cpy = ptr; 写过头了,使 cpy = malloc(sizeof(SOME_STRUCT_TYPEDEF)); 一文不值。还有其他问题。
  • 如果没有产生问题的可编译示例,真的很难说。

标签: c pointers memory-management malloc


【解决方案1】:

我会说明显缺乏对指针的理解是导致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);
}

但是,除非结构是giant,否则在堆上做就有点傻了,而你可以像这样在栈上做:

SOME_STRUCT_TYPEDEF cpy = *ptr;

【讨论】:

  • 好的,谢谢您的提示。如果我很快见到他,我会尽力传递它。
【解决方案2】:

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

【讨论】:

  • 不是我的代码,他正在做一些事情并寻求我的帮助,我被难住了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
相关资源
最近更新 更多