[C] 错误笔记:函数调用——值传递

时间:2022-12-27 15:46:28

前提:

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


错误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 ;
}

结果:

[C] 错误笔记:函数调用——值传递

分析错误:

在调用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 ;
}

结果:

[C] 错误笔记:函数调用——值传递

分析:

这次将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&plus;&plus; &sol;&sol;拷贝构造函数调用时机&sol;&sol;1&period;使用一个已经创建完毕的对象来初始化一个新对象 &sol;&sol;2&period;值传递的方式给函数参数传值 &sol;&sol;3&period;值方式返回局部对象

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

  6. java的值传递笔记

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

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

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

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

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

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

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

随机推荐

  1. android学习日记16--GridView&lpar;网格视图&rpar;

    一.GridView 1.简述 GridView按照行列来显示图片或文本的一种视图,排列其实有点类似TableLayout布局, 不过和TableLayout还是差别很大的,倒比较像二维的ListVi ...

  2. Zepto&period;js-事件处理

    http://www.webdevs.cn/article/68.html     web开发网 事件 $.Event $.Event(type, [properties]) ⇒ event 创建并初 ...

  3. WP Super Cache&plus;七牛云配置CDN加速,让你的网站秒开

    CDN加速网站是几乎所有的站长都在考虑的问题,CDN,全称是Content Delivery Network,即内容分发网络.所谓CDN加速,通俗的来说就是把原服务器上数据复制到其他服务器上,用户访问 ...

  4. PE知识复习之PE扩大节

    PE知识复习之PE扩大节 一丶为什么扩大节 上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节. 扩大节其实很简单.修改节数据对齐后的大小即可. 并且在PE ...

  5. mybatis学习 十一 缓存

    1. 应用程序和数据库交互的过程是一个相对比较耗时的过程2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率3. MyBatis 中默认 SqlSession 缓存(一级缓存)开启 同 ...

  6. CentOS 7安装Redis4&period;0&period;10

    cd /usr/local/src && wget http://download.redis.io/releases/redis-4.0.10.tar.gz && t ...

  7. hihocoder 1513 小Hi的烦恼——bitset

    题目:http://hihocoder.com/problemset/problem/1513 自带的题解写得很好…… #include<cstdio> #include<cstri ...

  8. Protocol Buffer Basics&colon; Python

    原文https://developers.google.com/protocol-buffers/docs/pythontutorial Protocol Buffer Basics: Python ...

  9. uva-11044-水题

    #include <iostream> #include<memory.h> #include<stdio.h> using namespace std; int ...

  10. nodejs记录1——async函数

    其实手动配置babel环境并不难,记录下步骤: 1.首先npm init创建一个nodejs项目 2.全局安装babel-cli处理工具:npm i babel-cli -g 3.cd到项目下安装ba ...