c语言中返回值和返回指针的问题

int  testA  (void)
{
int  b  =  1  ;
return  b;
}
char  *  testB  (void)
{
char  str[]  =  "abc" ;
return  str;
}
int  main()
{
printf(  "  the  value  of  testA  is  %d  \n",  testA()  );
printf(  "  the  value  of  testB  is  %c  ",  *(  testB()  )  ) ;
}

对于返回值的情况:

testA与main函数同在栈区,testA结束时C++创建临时变量,然后将返回值复制给该临时

变量。

printf( "  the  value  of  testA  is  %d  \n", testA())时输出的是该临时变量的值,testA中的b已经不存在。

对于返回指针的情况:

这是最复杂的部分。首先,对于上面的情形:返回一个数组的首地址,由于是返回char  *

类型,所以C++会首先创建一个char  *类型的临时变量,再把该数组的首地址赋给临时变量;

函数结束后该数组也就被销毁,这就意味着临时变量指向了一个“未声明的地址”,幸运的情况下,这段内存暂时还没有被其他的数据所覆盖,因此还能输出正确的内容。

在testB里面,如果换成char*  str="abc";return  str;  由于这时str指向的是全局数据区的一段内存地址,所以函数结束后临时变量也指向该地址,所以编译器不会提出警告。但这样的方法是不推荐的。

返回引用:

这中情况的效率最高,它直接返回一个对象,不产生返回值的副本。但同时也要注意避免返回局部引用的情况。

时间: 2024-10-03 05:57:48

c语言中返回值和返回指针的问题的相关文章

C语言中求余弦值的相关函数总结_C 语言

C语言cos()函数:求余弦值头文件: #include <math.h> cos() 函数用来求余弦值,即求角的临边长度除以斜边长度的比值,其原型为:     double cos(double x); [参数]x 为一个弧度. [返回值]返回-1 至1 之间的计算结果. 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 使用 rtod( ) 函数可以将弧度值转换为角度值. 注意,使用 GCC 编译时请加入-lm. [实例]求两个角度的余弦值并输出, #i

json-jax rs如何通过调用函数的返回值来返回相应的http状态?

问题描述 jax rs如何通过调用函数的返回值来返回相应的http状态? 需要实现这样的一个功能,在web api里拿到前台传来的json数据,调用DAO方法将该存入数据库中,在web api中根据DAO方法的返回的状态(例如存储成功或者失败)返回相应的http状态.应该是return Response.ok(xxx).build(); 是吗 那里面的xxx是DAO方法吧,那相应的DAO方法应该返回什么呢? 解决方案 顶啊............................ 解决方案二: 顶

Java语言入门教程(九):Java语言中的值传递

在第八篇博文中,介绍了编写方法体必须了解的基本知识点,初学者已经可 以自己写简单的例子进行练习.在练习过程中,我们不可能把所有的代码都放在 main方法中,Java类一定会有或多或少的方法成员,调用这些方法将是必要的步 骤.而调用方法成员时,如果该方法有参数,就必须要传递实际参数给方法的形 式参数.所以了解Java语言中的值传递是非常必要的. Java中的数据类型分两种,基本数据类型和引用类型.所以本文中也将分别 对这两种数据类型的值传递特征进行介绍. 1.基本数据类型的值传递:基本数据类型传递

j uery ajax 返回值-jQueryajax返回结果输出到页面

问题描述 jQueryajax返回结果输出到页面 $.ajax({ type:"get", url:"login", cache:false, dataType:text, data:{ userName:name, userPassword:pas, userCheck:certCode }, success:function(data){ alert("success"+data); } }); Struts中定义action(ajax能请求

swfupload 返回值-swfupload返回值不为对象

问题描述 swfupload返回值不为对象 我重java后台传递的为Map对象,在js页面就变成了{""path"":""test/img/login.jpg""}求swfupload怎么让他传递为对象而不是字符串呀{""path"":""http://localhost:8080/test/swf/14216677325335687.jpg""}

C语言 用指针作为函数返回值详解_C 语言

C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> #include <string.h> char *strlong(char *str1, char *str2){ if(strlen(str1) >= strlen(str2)){ return str1; }else{ return str2; } } int main(){ cha

C语言中返回错误信息的相关函数用法总结_C 语言

C语言strerror()函数:返回错误原因的描述字符串头文件: #include <string.h> 定义函数: char * strerror(int errnum); 函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回. 返回值:返回描述错误原因的字符串指针. 范例: /* 显示错误代码0 至9 的错误原因描述 */ #include <string.h> main() { int i; for(i = 0

xcode-c语言关于结构体类型的函数的返回值return

问题描述 c语言关于结构体类型的函数的返回值return 定义了一个全局变量的结构体,然后又定义了一个结构体类型的函数,函数的返回值如何返回一个空值,显然return 0;是不行的 解决方案 1)可以用结构体指针,因为指针的null是一个典型的"空",相对于int的0更能体现"空值"的含义,也最方便 2)结构体属于你自己定义的变量,所以你也可以规定当这个结构体里面的变量的值是某种情况是,认为这个结构体类型的变量是"空",比如一般意义上的int认为

关于JS中match() 和 exec() 返回值和属性的测试_javascript技巧

语法: exec() : RegExpObject.exec(string) match() : stringObject.match(string) stringObject.match(regexp) 知识点: exec() 是RegExp对象的方法,而 match() 是String对象的方法. 都会返回包含第一个匹配项信息的数组:或者在没有匹配项的情况下返回null. 返回的数组虽然是Array 的实例,但包含两个额外的属性:index 和 input.其中,index 表示匹配项在字符