C语言之指针(2)
来源:互联网 发布:下载360软件用的软件 编辑:程序博客网 时间:2024/05/21 09:32
函数调用,存在又入参和没有入参的调用,有返回值和没有返回值的调用。这里我们来分析以下关于指针作为形参的函数调用。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void getmem(char * str)
{
str = (char *) malloc(100);
strcpy(str,"copy string");
}
int main()
{
char * a = NULL;
getmem(a);
printf(a);
free(a);
return 0;
}
上述代码存在错误,从语法角度来看是没有任何问题的,那从功能角度来看,程序是想通过函数调用来给字符指针a 分配内存并在该内存中存放字符串 “copy string”,然后打印该字符串,最后释放指针a。
内存分配以及字符串拷贝都是在子函数getmem中实现的,通过指针作为参数,进行函数的调用。打印通过printf函数实现的,最后是释放指针。
咋一看,好像只有printf有问题,但是printf在某些平台上是没有错的,具体在哪里,我也不清楚。
主要分析getmem函数,入参是指针a,a是一个空指针,在这里是存在问题的,a的地址作为一个形参传递给了指针str,然后str重新指向一个大小为100字节的内存空间,
并拷贝字符串到该内存中。回到主函数中,打印a 得不到拷贝的字符串,这是因为指针a 的地址没有被改变。要想在子函数中改变指针 a 的地址,我觉得应该通过子函数的返回值来修改。无论传进去是一级指针还是二级指针,这个值都会被覆盖,拷贝的字符串的地址肯定是重新分配的内存空间的地址,而这个地址没有被返回到主函数中,故主函数没法得到想要的字符串。
子函数修改如下:
char * getmem()
{
char * str = (char *)malloc(100);
strcpy(str,"copy string");
return str;
}
主函数修改如下:
a = getmem();
阅读全文
0 0
- C语言之指针(2)
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- c语言之指针
- c语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- c语言之指针
- c语言之指针
- C语言之指针
- C语言之指针
- C语言之指针
- 10月10日云栖精选夜读:阿里云Tech Insight 企业迁云实战专场强势来袭!
- FairGUI基础
- 盒子模型里面的margin属性和padding属性杂记
- Oracle:导出表(即DMP文件)的两种方法
- SiteSucker使用记录
- C语言之指针(2)
- linux学习日记
- unity使用NAudio/NVorbis加载外部音频文件
- unity虚拟摇杆控制 Virtual Joystick
- 字符串的压缩
- js解决按需引入文件(IOS11引入fastclick有bug)
- Python才是世界上最好的言语,php,java靠边站
- activiti之流程变量
- DrawerLayout侧滑的