美文网首页
关于C语言中返回局部变量和局部指针变量

关于C语言中返回局部变量和局部指针变量

作者: VincentHK | 来源:发表于2018-04-03 10:06 被阅读0次

原文:https://blog.csdn.net/yangzhen19900701/article/details/9731657
char *test1(void)

{

char b[10] = "abcde";

return b;

}

char *test1_ver2(void)

{

static char b[10] = "abcde";

return b;

}

char *test2(void)

{

char c[10] = "abcde";

char *pStr = c;

return pStr;

}

char *test3(void)

{

char *c = "abcdef";

return c;

}

test1不能运行,甚至可能无法编译通过;因为char b[10] 是局部变量,其存放在栈上,在函数执行完成就会被释放。而返回它存放的地址,此时已经是可能是个非法地址。

test1_ver2可以正确运行,在test1中,我们说test1不能运行或出现编译错误的原因是 b[]数组在函数执行结束后会被释放,如果我们再对其存放空间进行访问就会出错,此时我们定义static char b[10]; 将其存放在静态存储区,只有在程序运行结束后才会被系统回收,即使退出该函数,b[]数组存放的静态存储区始终存在,所以,我们再对其进行访问,不会出现错误

test2可以运行。c[10]和*pStr均保存在栈中;该函数返回值是保存在pStr指针中的c数组在栈中的存放地址,当调用该函数时,该地址被复制到外部的指针变量中,然后,保存在栈上的c[]数组和pStr指针的内存空间被释放。c[]数组的存放地址是被传送出去了的,但是,由于c[]是局部变量, 在函数执行完成后,存放的内存空间就被释放,所以,在外部通过指针访问c[]数组时,指向的内存空间无效,而且还可能出现访问非法内存的危险。虽然这样能够运行,但是没有实际效果

test3可以运行。*c指针c是保存在栈中,"abcdef"字符串保存在文字常量区,其存放空间,直到程序执行结束才会被系统回收。所以,返回它的地址是一个实际存在的有效地址。

相关文章

  • 关于C语言中返回局部变量和局部指针变量

    原文:https://blog.csdn.net/yangzhen19900701/article/details...

  • 03-Golang局部变量和全局变量

    局部变量 在C语言中写在{}中或者函数中或者函数的形参, 就是局部变量 Go语言中的局部变量和C语言一样 全局变量...

  • 不要返回局部变量的引用或指针

    不要返回局部变量的引用或指针,因为函数返回时,局部变量会被释放,引用或指针指向的内容会失效。 例如以下程序 返回局...

  • golang的相关问题(返回局部变量指针、分配原语、init、值

    golang的注意点 ==目录== [TOC] 1. 可以返回局部变量的指针 作为少数包含指针的语言,它与C还是有...

  • 动态内存分配

    《c和指针》阅读笔记 前言:为什么要使用动态内存分配?函数的局部变量会进行回收,相比于函数的局部变量,有什么好处呢...

  • go 语言第二节课

    变量知识点 定义以及初始化变量 变量的连续定义 局部变量与全局变量的关系1.什么是局部变量?1.1在C语言中写在{...

  • Block的深入学习

    (一)Block基础回顾 1.Block定义 带有局部变量的匿名函数,差不多就与C语言中的函数指针类似,可以当做参...

  • go 的内存逃逸

    在C/C++ 中,例如对于局部变量的分配是在栈上,在go语言中,这是不确定的,局部变量的内存分配也许发生在堆上。 ...

  • 局部变量和全局变量

    什么是局部变量? 在Go语言和C语言中写在{}中或者函数中或者函数的形参, 就是局部变量 什么是全局变量? 在Go...

  • 指针指向局部变量会发生什么

    上面是一段c++代码,pStr指针指向了一个局部变量。当函数走完,局部变量所占内存会被释放,之后可能会被别的变量使...

网友评论

      本文标题:关于C语言中返回局部变量和局部指针变量

      本文链接:https://www.haomeiwen.com/subject/xgkqhftx.html