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();


原创粉丝点击