1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > c语言函数给二级指针形参实现内存分配并拷贝数据 子函数内malloc分配内存 论如何改

c语言函数给二级指针形参实现内存分配并拷贝数据 子函数内malloc分配内存 论如何改

时间:2019-10-24 19:44:31

相关推荐

c语言函数给二级指针形参实现内存分配并拷贝数据 子函数内malloc分配内存 论如何改

工作中优化一段代码,代码中有一大段分配堆内存的内容,我觉得这段代码太长了,更适合放在子函数里面。

我把指针作为参数,然后在子函数中malloc分配内存,结果出现了问题,函数结束后,以参数传进来的指针并没有指向分配的内存。

比如说:

int fun(unsigned char *p, unsigned char **p1) {

p = (unsigned char *)malloc(N * sizeof(unsigned char));

if (NULL == p)

return -;

// 给二维指针p1分配

p1 = fun_set_p1();

if (NULL == p1) {

free(p);

return -;

}

return ;

}

unsigned char *p;

unsigned char **p1

fun(p, p1);

运行完fun后,*p和**p1并没有发生变化。

指针作为参数不是传的是地址吗?怎么没变化呢?

其实这样想是一种误区,其实指针作为参数也是值传递,在函数中将参数复制一份而已。指向的是同一块内存地址。假设参数传的是int *p,函数内copy的j是int *p_1。在函数中操作*p_1,例如*p_1 = 1, 则p_1所指向的内容就变成了1.,由于他们是指向同一块地址,所以即使他们不是同一个指针*p所指向的内存也会被改变。

但如果让p_1指向其他的内存地址,则由于是值传递,p并不会因此而改变。

其实反汇编可以看出,参数的传递其实就是将变量放入新开辟的函数栈空间,也就是我说的“copy一份”,函数中再对栈空间里的内容操作,这就是值传递的本质。

所以这种情况该怎么办呢?

一种情况是函数 返回 指向新申请内存的指针

unsigned char* fun() {

unsigned char* p = malloc(N * sizeof(unsigned char));

return p;

}

但如果你需要设置多个指针就不合适了。

另一种办法就是使用二级指针、三级指针。

int fun(unsigned char **p, unsigned char ***p1) {

*p = (unsigned char *)malloc(N * sizeof(unsigned char));

if (NULL == *p)

return -;

// 给二维指针p1分配

*p1 = fun_set_p1();

if (NULL == *p1) {

free(*p);

return -;

}

return ;

}

unsigned char* p;

unsigned char** p1;

fun(&p, &p1);

其实就是指向指针的指针。

函数内值传递,拷贝一份,其指向的内存的内容改变了,参数指向的内存的内容就跟着变了。

C++ 数组长度 以及 数组名作为参数传递给函数 以及 为什么不在子函数中求数组长度

在看排序,首先是插入排序,思路理清后想用代码实现,然后问题来了: 如何求数组长度? 如果没记错,在Java中应该是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有 ...

【c++】指针参数是如何传递内存的

[c++]指针参数是如何传递内存的 如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下: void GetMemory(char *p, int num) { p = (char *) ...

【转】【c++】指针参数是如何传递内存的

参数策略 如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下: void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(c ...

c++指针参数是如何传递内存的

参数策略 如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下: void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(c ...

【转】【C/C++】内存分配函数:malloc,calloc,realloc,_alloca

转自:/particle/archive//09/01/2667034.html#commentform malloc: 原型:extern voi ...

c malloc分配内存

php中的内存分配有用类似emalloc这样的函数,emalloc实际上是C语言中的malloc的一层封装,php启动后,会向OS申请一块内存,可以理解为内存池,以后的php分配内存都是在这块内存池中 ...

<转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明

这篇文章看后感觉不错,和我在glibc下的hurdmalloc.c文件里关于malloc的实现基本意思相同,同时,这篇文章还介绍了一些内存管理方面的知识,值得推荐. 原文链接地址为:http://ww ...

C++ 内存、new与malloc分配内存区别?

一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建. ...

随机推荐

Android Studio 个人常用设置

1.主题 Darcula主题真的看起来舒服很多呢: 2.常用快捷键 "Toggle Case" "Quick Documentation" "Refo ...

Windows 程序设计

一.Win32 API /******************************************************************** created: /04/1 ...

A BRIEF HISTORY OF COMPUTERS

COMPUTER ORGANIZATIONAND ARCHITECTUREDESIGNING FOR PERFORMANCENINTH EDITION Vacuum Tubes Transi ...

利用青瓷布局自定义加载的场景,而不是自己改写qici-loading

加载界面如果全部通过自己手动布局不仅不美观,还很难控制.借用原生的场景切换加载效果,来实现我们游戏的加载效果. 没有做加载修改的原来的加载顺序: 黑乎乎界面->(游戏定制的加载)你的第一个场 ...

[Node.js]expressjs简单测试连接mysql

下载好node.js和通过npm安装好express.js后,先写package.json { "name": "application-name", &quo ...

(简单) POJ 2406 Power Strings,扩展KMP。

Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

angular学习笔记01

angular.js路由功能 用于实现单页应用 //html 代码

C# 读写文本文件乱码解决方案

在使用C#对文本文件读取的时候,如果其中包含了中文,经常会出现乱码.一般解决是在StreamReader加一个编码,我使用的是Encoding.UTF8,一般情况下使用这个参数就可以.但是,在这次我使 ...

Day9 轨道角动量

转自中山大学电子与信息工程http://seit./node/1004 能量.动量(角动量和线动量)光子的基本属性,其中光子角动量包括自旋角动量和轨道角动量(Orbital a ...

详解如何使用Docker Hub官方的MySQL镜像生成容器

一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像.但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了.Docker Hub官方提供的CentO ...

c语言函数给二级指针形参实现内存分配并拷贝数据 子函数内malloc分配内存 论如何改变指针参数所指内存 二级指针 三级指针的应用...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。