【问题标题】:malloc in a function doesn't work well函数中的 malloc 不能正常工作
【发布时间】:2012-11-24 14:09:47
【问题描述】:

我不明白为什么整个事情都不起作用。

我只想在函数func 中做malloc,当我从它返回时,malloc 消失了......我得到了

* 检测到 glibc ./test: free(): invalid pointer: 0xb76ffff4 **

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <string.h>
#include <errno.h>

int func(char *p) {
    p=(char*)malloc(1);
    *p='a';
    printf("1. p= %c\n",*p);
    return 0;
}

int main()
{
    char *p;

    func(p);
    printf("2. p= %c\n",*p);
    free(p);

    return 0;
}

【问题讨论】:

  • 您正在尝试释放无效指针。 p 只是指针的副本。
  • C 是call by value,有一个怪癖,当您将数组传递给函数时,它们会变成指针。
  • 通常在 C 中分配内存,然后传递给使用它的函数,然后在分配它的同一个函数中释放内存。

标签: c ubuntu malloc


【解决方案1】:
char *p;

创建一个指向 main() 的本地指针,您可以将它传递给另一个函数,但是您可以按值传递它,因此您对它所做的任何更改(例如更改其指向的内容)都超出了范围。不会“坚持”。

解决办法是把指针传给指针,或者干脆p的地址:

func(&p);

但不要忘记更改func()的参数列表!

int func(char **p)

【讨论】:

  • c 和 c++ 中的这些东西有什么区别吗?也许这就是让我感到困惑的事情?因为我不记得我曾经这样做过
  • @hudac - 挑衅! C++ 有一个“按引用传递”的概念,从技术上讲,它在 C 中不存在,“解决方法”是传递变量的地址(如本例所示)
【解决方案2】:

在 func 中,p 是您传递给它的指针的副本,因此 p 在 func 内部创建并在 func 完成时删除。

你有两个解决方案:

  1. 将指针传递给指针,一个char **p,然后执行*p = malloc(1),然后func将接受一个char **p
  2. 返回分配的变量 un func 并赋值:p = func();

【讨论】:

  • c 和 c++ 中的这些东西有什么区别吗?也许这就是让我感到困惑的事情?因为我不记得我曾经这样做过
  • 在 C++ 中,您仍然可以访问 malloc() 函数,但您必须使用适用于对象的 C++“new”运算符语法。
【解决方案3】:

在 main 中传递 &amp;p 表示将 func 调用为 func(&amp;p)func(char *p)的函数签名改为func(char **p)

func 中的pfunc 的本地地址,因此当func 退出时,它会被破坏并导致内存泄漏。

在 main 中,您正在释放一个未指向由 malloccalloc 分配的内存的指针,因此在这种情况下,free(p)Undefined behaviour,它并没有释放您在 @987654333 中分配的内存@所以这是内存泄漏

第一种方法:

void func(char **p)
{
 *p=malloc(1); 
//rest of your code here 
 }

int main()
{
 int *p;
 func(&p);
 // your code here 
 free(p); 
}

方法二:不用**很简单

char * func(char *p)
{
p=malloc(1);
// rest of code here 
return p; 
}

int main()
{
char *p;
p=func(p);
//rest of code here 
free(p);
}

【讨论】:

  • 我不应该只在我将“p”设置为“char p”而不是“char *p”时才执行“func(&p)”吗?
  • 如果 funcs 接受一个 char **p 并且 p 是一个 char *,那么 &p 将是一个 char **,这很好。
  • @Intrepidd:同意你的意见
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多