关于子函数返回字符串问题集锦

Case1:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* getMem(void)
{
      char  p[] = "hello world";//这样子定义可以输出,但输出乱码。
      p[5] = 0x0;
      return p;
}

int main()
{
    char *s="fzz";
    s=getMem();
    printf("%s\n",s);
    return 0;
}

至于程序运行结果已经注明在程序中。那么为什么会乱码呢?依我自己的理解是:

字符串数组p是个局部变量,存在栈内。当子函数返回时,栈空间也会被销毁。那么返回的字符串首地址p对应的内存保存的已经不是hello world了。而是未知的。因此输出乱码。

Case 2:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* getMem(void)
{
      static char  p[] = "hello world";//可以输出,输出为hello;
      p[5] = 0x0;
      return p;
}

int main()
{
    char *s="fzz";
    s=getMem();
    printf("%s\n",s);
    return 0;
}

此处我们把字符串数组p定义为静态变量,存储在静态存储区。不随着子函数的返回而销毁。因此可以正常运行。

Case 3:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* getMem(void)
{
      char  *p = "hello world";//程序运行时出错 不能输出
      p[5] = 0x0;
      return p;
}

int main()
{
    char *s="fzz";
    s=getMem();
    printf("%s\n",s);
    return 0;
}

这里不能输出和case1有点相像,但又并不完全一样。因为字符数组中各元素的值是可以改变的(可以对他们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被改变的。这是因为在C语言中只有字符变量和字符串常量,没有字符串变量,而常量是不可以改变的。因此p[5]=0x0本身就是错误的。尽管编译通过了,但运行还是会出错。此处与存储无关。因此加不加static结果都是一样的。

如:

char a[]="hello";

char *b="hello";

a[2]=‘r‘;//允许对字符变量赋值

b[2]=‘d‘;//错误,字符串常量不可改变。

Case 4:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* getMem(void)
{
      char  *p = "hello world";//程序可以运行 输出为"hello world"
      return p;
}

int main()
{
    char *s="fzz";
    s=getMem();
    printf("%s\n",s);
    return 0;
}

这是因为如果定义一个字符数组,它只是一个字符数组变量,随着函数的调用结束,该变量所占有的内存也随之释放,因此返回的值是任意的;但是,如果用指针,它始终指向分配的内存,直到释放掉,因此返回值为"hello
world"。

时间: 2024-07-28 22:39:09

关于子函数返回字符串问题集锦的相关文章

shell 函数返回字符串的方法

shell的函数只能返回整数值,如果想让函数返回字符串可以在函数调用处为变量赋值. # 定义函数function test() { name=$1 echo "123213" } # 调用函数,执行结果赋值给变量ret ret=$(test "lishichao") echo $ret # 执行结果 [[email protected]-test shell]# sh test.sh 123213 最近在写一键安装脚本,一个一个判断输入参数太麻烦,所以使用shell

SqlSever基础 Upper函数 返回字符串的大写形式

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 --返回字符串的大写形式 2 select upper('asdf') 2 show ------------------------------------------博文的精髓,在技术部分,更在镇场一诗.SqlSever是优秀的语言,值得努力学习.熟悉数据库的增删查改,写程序

SqlSever基础 lower函数 返回字符串的小写形式

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 --返回字符串的小写形式 2 select lower('ASDF') 2 show ------------------------------------------博文的精髓,在技术部分,更在镇场一诗.SqlSever是优秀的语言,值得努力学习.熟悉数据库的增删查改,写程序

shell函数返回字符串

shell函数的返回值(return),仅支持整数 #!/bin/sh get_str() { return "string" } get_str echo $? 输出如下: ./test.sh: line 5: return: string: numeric argument required 255 可以看到已经提示要求return 整数类型,真实返回值是255. 解决办法: #!/bin/sh get_str() { echo "string" } echo

实战c++中的string系列--函数返回局部变量string(引用局部string,局部string的.c_str()函数)

当函数返回字符串的时候,我们可以定义返回string和string&. 1写一个返回string引用的函数 std::string & TestStringReference() { std::string loal_str = "holy shit"; return loal_str; } 这个函数当然是错误的,编译器会提示我们: 返回局部变量或临时变量的地址: loal_str 即不能返回局部变量的引用. 2写一个返回string的函数(函数返回局部变量string

Shell函数返回值、删除函数、在终端调用函数

Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] } 如果你愿意,也可以在函数名前加上关键字 function: function function_name () { list of commands [ return value ] } 函数返回值,可以显式增加return语句:如果不加,会将最后一条命令运行结果作为返回值. Shell 函数返

Shell函数:Shell函数返回值、删除函数、在终端调用函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] } 如果你愿意,也可以在函数名前加上关键字 function: function function_name () { list of commands [ return value ] } 函数

用php的strpos() 函数判断字符串中是否包含某字符串的方法

PHP strpos() 函数 strpos() 函数返回字符串在另一个字符串中第一次出现的位置. 如果没有找到该字符串,则返回 false.语法 strpos(string,find,start) 参数 描述string 必需.规定被搜索的字符串.find 必需.规定要查找的字符.start 可选.规定开始搜索的位置. 注释:该函数对大小写敏感.如需进行对大小写不敏感的搜索,请使用 stripos()函数.编辑本段例子 <?php echo strpos(www.idc-gz.com,"

ORACLE常用数值函数、转换函数、字符串函数

本文并不准备介绍全部的oracle函数,当前情势下,俺也还没这个时间,需要学习的东西太多了,要把多数时间花在学习经常能用上的技术方面:),所以如果是准备深入了解所有oracle函数的朋友,还是去关注:Oracle SQL Reference官方文档更靠谱一些. 本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表示数字型,C表示字符型,D表示日期型,