无法把指针变量本身传递给一个函数
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]#
注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。
分享到:
相关推荐
C语言函数返回值解析 C语言函数返回值解析是指在C语言编程中,函数返回值的处理机制。函数返回值可以是变量、指针、数组、结构体等各种形式,但归根结底,函数返回值都是一个值,或者是一个地址。在C语言中,函数...
函数返回值是C语言编程中的重要概念,它不仅涉及到函数的设计和实现,还关联到内存管理、数据类型转换等多个方面。理解函数返回值和参数传递机制,对于编写高效、健壮的程序至关重要。通过本文的介绍,初学者应能...
本文将深入探讨“C函数调用-不使用函数返回值”的概念,通过分析给定的代码示例,解释不同类型的函数参数传递方式,并讨论其潜在的影响和最佳实践。 ### 函数调用与参数传递 在给定的代码示例中,我们看到了多种...
枚举类型和函数返回值是C语言中非常重要的特性,它们能够帮助开发者更好地组织和管理代码。合理利用枚举类型可以提高代码的可读性和可维护性;而通过使用枚举作为函数返回值,则可以让代码更加健壮和易于调试。掌握...
296-用P0 、P1口显示整型函数返回值(51单片机C语言实例Proteus仿真和代码)296-用P0 、P1口显示整型函数返回值(51单片机C语言实例Proteus仿真和代码)296-用P0 、P1口显示整型函数返回值(51单片机C语言实例Proteus仿真...
下面我们将深入探讨嵌入式系统中的C语言编程基础,特别是关于函数返回值的相关知识点。 1. **函数定义与声明** 在C语言中,函数定义包含函数名、返回类型和参数列表。例如: ```c int add(int a, int b) { ...
C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
本教程“C语言29:用P0 、P1口显示整型函数返回值”将重点讲解如何利用这些端口来呈现整型函数的返回值。 首先,我们需要理解P0和P1口的基本工作原理。P0口是8位双向数据口,既可以用作输入也可以用作输出。当作为...
在C语言中,当我们声明一个函数并希望接受数组作为参数时,实际上传递的是数组的首元素地址,因为数组名在大多数情况下等价于指向其首元素的指针。有三种常见的方式声明这种函数: 1. 形式参数为指针:`void ...
指针作为函数返回值能带来灵活性,但也需要遵循一些规则以避免潜在的问题,比如确保返回的指针始终指向有效的内存区域。在编写涉及指针的代码时,应特别注意内存管理,以防止内存泄漏或访问无效内存。通过不断地练习...
函数参数与函数调用 1、函数调用的作用: ·用实参数向形式参数传递数据; ·为获得数据参数及在函数体中声明的变量分配存储空间; ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调...
综上所述,C语言函数是编程中的基础单元,它实现了程序的模块化和功能封装。通过合理地定义和使用函数,程序员可以编写出结构清晰、易于维护的代码。同时,理解函数类型说明和返回值的机制对于正确编程和避免编译...
7. **函数返回值类型匹配**:如果主调用函数期望`double`类型的返回值,而被调用函数返回`float`类型,编译器会自动提升`float`到`double`,因此返回值的类型是`double`。选项C(double型)是正确的。 8. **变量...
函数返回值设计的多样性和语言支持 函数的返回值为什么只能有一个?这个问题引发了我们对函数设计和语言支持的思考。在本文中,我们探讨了函数返回值的限制、多返回值的需求、语言支持的不足和可能的解决方案。 ...
总结来说,C语言函数是实现功能的核心工具,熟练掌握函数的定义、调用、参数传递、返回值处理等技巧,将使你能够编写出更高效、更易维护的C程序。在编程实践中,不断探索和理解这些知识点,将有助于提升你的C语言...
这两个函数在处理大量数据时非常有用,但初学者可能会遇到一些困惑,尤其是当它们的返回值不按预期工作时。这里我们将详细探讨为什么`fread()` 和 `fwrite()` 的返回值可能为0,以及如何正确理解和使用它们。 `...
本篇将详细介绍C函数查寻工具及其对学习和开发C语言的重要性。 首先,C语言中的函数是代码组织的基本单元,它封装了特定的功能,可以被其他部分的代码调用。理解函数的工作原理,包括参数传递、返回值、局部和全局...
296-用P0 、P1口显示整型函数返回值单片机C语言源码.zip项目程序C语言源码下载296-用P0 、P1口显示整型函数返回值单片机C语言源码.zip项目程序C语言源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 ...