前提:

写一个函数,功能为在堆内开辟一块空间,并将首地址以函数参数的形式返回主调函数


错误demo

void test(char *a)
{
char str[] = "hello";
printf("%s\n", str);
a = (char *) malloc(strlen(str) + );
memcpy(a, str, strlen(str));
a[strlen(str)] = '\0';
return;
} int main()
{
char *test_p = NULL;
test(test_p);
printf("%s \n", test_p);
free(test_p);
return ;
}

结果:

分析错误:

在调用test函数的时候只是将test_p的值(NULL)传递给了test函数,也就相当与只是为test函数中的a(指针)做了个初始化,然后进行申请内存

在test内的局部变量a指向了开辟的内存的首地址,之后的任何操作都是对于这个局部变量的,跟主调函数中的test_p没有任何关系

这样test_p当然还是之前的初始值NULL

而且这个例子中test内的malloc并没有得到手动释放(free)


正确demo

void test(char **a)
{
char str[] = "hello";
printf("%s\n", str);
*a = (char *) malloc(strlen(str) + );
memcpy(*a, str, strlen(str));
(*a)[strlen(str)] = '\0';
return;
} int main()
{
char *test_p = NULL;
test(&test_p);
printf("%s \n", test_p);
free(test_p);
return ;
}

结果:

分析:

这次将test_p这个指针变量的地址传递给了test函数,此时的*a就是test_p了

继续申请内存,test_p来指向首地址,没有任何问题了


本节完......

[C] 错误笔记:函数调用——值传递的更多相关文章

  1. 错误处理: Python值传递和引用传递的问题

    1.插入数据库的时候报错110, 提示columns数量少于插入的值内容. 2.核对了下栏目并没有少,打印出插入的值,看看值是不是多了. 查看了下,确实第二次值的时候长度边长了,第二次把第一次的部分值 ...

  2. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  3. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  4. C语言笔记--传递结构指针以及值传递,址传递

    #include <stdio.h> #include <windows.h> #include <mmsystem.h> #include <string. ...

  5. C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象

    1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...

  6. java的值传递笔记

    1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到 ...

  7. 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

    方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...

  8. C++函数调用之——值传递、指针传递、引用传递

    1.简介 1.值传递:形参时实参的拷贝,改变函数形参并不影响函数外部的实参,这是最常用的一种传递方式,也是最简单的一种传递方式.只需要传递参数,返回值是return考虑的:使用值传递这种方式,调用函数 ...

  9. Android笔记(二十) Activity中的跳转和值传递

    我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 显式Intent跳 ...

随机推荐

  1. HGOI2010816 (NOIP 提高组模拟赛 day1)

    Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts) 100+70+40=210 rank 29 这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Has ...

  2. JavaScript条件和循环以及异常处理

    JavaScript条件和循环以及异常处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.布尔类型(Boolean) 布尔类型仅包含真假,与Python不同的是其首字母小写. ...

  3. cin,cout,printf,scanf效率对比

    From:http://www.cnblogs.com/killerlegend/p/3918452.html Author:KillerLegend Date:2014.8.17 杭电OJ之3233 ...

  4. Intellij IDEA导入web项目详解(解决访问的404)

    开始时的首页 点击modules 点击modules界面的Paths 点击Libraries 选择lib文件 点击Facets 选择项目 这就是我404的主要原因,因为小白第一次使用idea 所以很疯 ...

  5. POJ 3537 multi-sg 暴力求SG

    长为n的一列格子,轮流放同种棋子,率先使棋子连成3个者胜. 可以发现每次放一个棋子后,后手都不能放在[x-2,x+2]这个区间,那么相当于每次放棋将游戏分成了两个,不能放棋者败. 暴力求SG即可 /* ...

  6. Python学习笔记5-时间模块time/datetime

    import time time.sleep(2) #等待几秒 # 1.格式化好的时间 2018-1-14 16:42 # 2.时间戳 是从unix元年到现在所有的秒数 # 3.时间元组 #想时间戳和 ...

  7. html5 canvas 对角线渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 10个造型奇特的css3进度条(有的html被编辑器转义了,上面的代码还是OK的)。。。转载

    <div id="caseVerte"> <div id="case1"></div> <div id="c ...

  9. [整理]Assembly中的DLL提取

    当机器上安装一些程序后,Assembly中的DLL会变得越来越丰富. 拿个常见问题来说明. 安装ReportViewer后其中会出现以下DLL. Microsoft.ReportViewer.Proc ...

  10. JavaScript继承详解(一)

    面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++.C#.Java)的开发经验. 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则 ...