无法把指针变量本身传递给一个函数
void GetMemory(char * p, int num) { p = (char *)malloc(num*sizeof(char)); } intmain() { char *str = NULL; GetMemory(str,10); strcpy(str,”hello”); free(str);//free 并没有起作用,内存泄漏 return 0; }
在运行strcpy(str,”hello”)语句的时候发生错误。这时候观察str 的值,发现仍然为NULL。
也就是说str 本身并没有改变,我们malloc 的内存的地址并没有赋给str,而是赋给了_str。
而这个_str 是编译器自动分配和回收的,我们根本就无法使用。所以想这样获取一块内存是
不行的。那怎么办? 两个办法:
第一:用return。
char * GetMemory(char * p, int num) { p = (char *)malloc(num*sizeof(char)); return p; } intmain() { char *str = NULL; str = GetMemory(str,10); strcpy(str,”hello”); free(str); return 0; } 这个方法简单,容易理解。 第二:用二级指针。 void GetMemory(char ** p, int num) { *p = (char *)malloc(num*sizeof(char)); return p; } intmain() { char *str = NULL; GetMemory(&str,10); strcpy(str,”hello”); free(str); return 0; }
注意,这里的参数是&str 而非str。这样的话传递过去的是str 的地址,是一个值。在函
数内部,用钥匙(“*”)来开锁:*(&str),其值就是str。所以malloc 分配的内存地址是真正
赋值给了str 本身。
C 函数多个返回值
1. 使用全局变量
2. 传递数组指针
#include <stdio.h> #include <stdlib.h> int* Pool(int array[],int size) { int *x; int i=0; int a[2]={0,1}; for(i=0;i<size;i++) { a[0]+=array[i]; //存储数组元素值的和 a[1]*=array[i]; //存储数组元素值的积 } //将数组的基地址赋值给整型指针 x=&a[0]; //返回整个数组 return x; } int main() { int a[]={1,2,3,4}; int *c; c = Pool(a,4); printf("Sum = %d\nProduct = %d\n",c[0],c[1]); // getchar(); return 0; }
[root@egovmo03 C]# gcc max.c
[root@egovmo03 C]# ./a.out
Sum = 10
Product = 24
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。
3使用结构体:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct inf{/*定义学生结构体,分别包含成员学号、姓名、班别、总评成绩*/ char xh[12]; char name[20]; char class[15]; int chj; }; main(void) { struct inf a1; /*定义学生结构体类型变量*/ void xxxx(struct inf *ptr); printf("请输入学号,姓名,班别,总评成绩,以空格隔开:\n") ; xxxx(&a1);/*调用函数,以学生结构体类型变量地址作为实参*/ printf("学号:%s,姓名: %s,班别:%s,总评成绩:%d\n",a1.xh, a1.name,a1.class,a1.chj); getchar(); } void xxxx(struct inf *ptr)/*该函数实现对结构体成员数据的录入操作*/ { char xh1[12],name1[20],class1[15]; int chj1; scanf("%s%s%s%d",xh1,name1,class1,&chj1); strcpy(ptr->xh,xh1); strcpy(ptr->name,name1); strcpy(ptr->class,class1); ptr->chj=chj1; }
~
[root@egovmo03 C]# gcc stu.c
[root@egovmo03 C]# ./a.out
请输入学号,姓名,班别,总评成绩,以空格隔开:
002 xhu c1 234
学号:002,姓名: xhu,班别:c1,总评成绩:234
[root@egovmo03 C]#
注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。