无返回值函数传入一级指针后造成的内存泄露问题

错误代码如下示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void get_memory(char *p, int num)
{
  p = (char *)malloc(sizeof(char)*num);
}

int main(int argc,char *argv[])
{
  char *str = NULL;
  get_memory(str, 100);
  strcpy(str, "hello");
  printf("resut: %s\n", str);

  return 0;
}

linux下执行结果

$ ./tt
Segmentation fault

析:

调用函数 get_memory() 后,p将被系统释放,但由于malloc是在堆中分配的,只有当程序结束后才释放,这样将造成内存泄露。

linux下,由于函数调用后p的值变为了0x00,这样再执行strcpy时由于访问了无效地址而出现了段错误。

正确代码如(采用了二级指针方式)下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void get_memory(char **p, int num)
{
  *p = (char *)malloc(sizeof(char)*num);
}

int main(int argc,char *argv[])
{
  char *str = NULL;
  get_memory(&str, 100);
  strcpy(str, "hello");
  printf("resut: %s\n", str);

  return 0;
}

执行结果如下:

$ ./tt
resut: hello
时间: 2024-10-12 02:43:42

无返回值函数传入一级指针后造成的内存泄露问题的相关文章

&lt;10&gt; 无参无返回值+ 无参有返回值函数的定义+有参无返回值函数定义+ 有参有返回值函数定义+函数的参数+函数的参数传递过程

无参无返回值: 1 #include <stdio.h> 2 3 4 /** 5 * 定义一个无参无返值函数 6 * 7 */ 8 void print_line(){ 9 10 printf("-----------------\n"); 11 12 } 13 14 15 16 int main(int argc, const char * argv[]) { 17 //调用函数 18 print_line(); 19 20 return 0; 21 } 无参有返回值函数

返回类型和return语句:无返回值函数,有返回值函数,返回数组指针

重点: 1.return语句功能:终止当前正在执行的函数并将控制权返回到调用该函数的地方.Return语句两种形式: Return: Return expression; 2.返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return. 3.Void函数如果想中间退出,可以使用return,作用相当于break,提前退出. 4.一个返回类型是void的函数也可以使用return expression形式,不过return语句的expression必须是另

Python3基础 定义无参数无返回值函数 调用会输出hello world的函数

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: def FunHelloWorld() : print('hello world') print('hello world') FunHelloWorld() result: ============= RESTART: C:/Users/Administrator/Deskt

C#中的函数(-) 无参无返回值的函数

分析下C#中的函数 先写一个小例子,一个静态函数,无返回值,无形参 在第17行与20行分别下断点 F5调试运行,此时中断在第17行MyFunction(), 在第17行右键反汇编,看下反汇编代码 这里的Call 002D0C30  对应用就是MyFunction() 此时F11直接进入MyFunction函数内部查看我们函数 002D2CA0就是MyFunction的入口,这里就有疑问了,明明上面Call 002D0C30,这里为什么是002D2CA0呢? 在地址栏上转到002D0C30,结果V

python 最简单的函数(无参无返回值)

#定义了一个无参无返回值的函数def myPrint(): print("sunck is a very good man!") print("sunck is a nice man!") print("sunck is a handsome man!") myPrint()myPrint()myPrint()myPrint()myPrint() 原文地址:https://www.cnblogs.com/pygo/p/12243029.html

动态SQL实现与注意事项(有返回值与无返回值动态SQL 实现)

1.分类 当执行的SQL语句需传入变量时,必须使用SQL 动态语句实现: 动态语句分两种情况: (1)有返回值动态SQL (2)无返回值动态SQL 2.实现 假设存在一个学生表,具有UserID, UserName两列,属性为INT 与VARCHAR(20) 2.1 普通SQL 语句实现 SELECT UserID, UserName FROM StdTable WHERE UserID=123; 2.2 动态SQL 实现 --根据输入的ID查询出相应数据 DECLARE @ID INT DEC

多返回值函数的编写方法

方法一:利用全局变量 注意,该方法虽然可以实现有多个返回值的函数,但是由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用. 方法二:使用数组指针 注意,该方法适用于多个返回值的数据类型一致的情况. 方法三:使用结构体指针 注意,当函数要求返回的多个值是相互关联的,或者返回的多个值数据类型不一致时可以采用该方法. 详细内容请参考:http://blog.csdn.net/suprem

Java基础---Java中带参数无返回值方法的使用(三十九)

Java 中带参无返回值方法的使用 有时方法的执行需要依赖于某些条件,换句话说,要想通过方法完成特定的功能,需要为其提供额外的信息才行.例如,现实生活中电饭锅可以实现"煮饭"的功能,但前提是我们必须提供食材,如果我们什么都不提供,那就真是的"巧妇难为无米之炊"了.我们可以通过在方法中加入参数列表接收外部传入的数据信息,参数可以是任意的基本类型数据或引用类型数据. 我们先来看一个带参数,但没有返回值的方法: 上面的代码定义了一个 show 方法,带有一个参数 name

jquery的ajax方法在无返回值时的返回值类型设定

2013-12-07 19:15:29|  分类: Web前端 |  标签:html  |举报|字号 订阅 $.ajax({ type: "post", url: "index.php", data: "id="+uid, dataType:"json", success : function(){ alert(1); }, error: function(){ alert(0); } }); 在jquery的ajax方法中,