变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在

函数内创建的数组在调用后,是不是就不存在

本帖最后由 test_lockxxx 于 2014-04-23 09:31:06 编辑

第1种写法:

char *getABC()

{

char str[10];

strcpy(str,"12345");

return str;

}

void main()

{

char *p = getABC();

printf("%s\n",p);   //这样正确吗?p 指向的位置是不是已被 自动释放了,

}

第2种写法

void getABC(char *pStr)

{

strcopy(pStr,"123456");

}

void main()

{

char str[10];

getABC(str);

printf("%s\n",p);   //这样正确吗?

}

------解决方案--------------------

第二种正确(如果不是写错的话)

c是一种比较靠近底层的语言。

------解决方案--------------------

第一种返回了局部变量的地址,这个地址指向的内容在函数结束后可能被修改,所以你取p的值的时候可能会得不到你想得到的内容

------解决方案--------------------

生命周期的问题。 可以在堆上申请空间。

------解决方案--------------------

就回收了的   栈就是这样

------解决方案--------------------

验证了一下:

写法1,打印出来的是乱码。 --- 数组被释放了,该内存地址内容是随机的,str[10]是全局变量就不存在问题。

方法2,是对的,指针传递。 不过有两处语法错误。

------解决方案--------------------

这样也对:

char *getABC()

{

static char str[10];

strcpy(str,"12345");

return str;

}

void main()

{

char *p = getABC();

printf("%s\n",p);   //这样正确吗?p 指向的位置是不是已被 自动释放了,

}

------解决方案--------------------

建议你去看看数据的存储,这就是一个数据存储类型的问题

------解决方案--------------------

你想知道的是这些?

用这样的方式,如

int a[16]

这个数组是被当作直接存取的数据,生命周期在作用域内,过了就不存在了。

但是如果用

int * a =new  int[16];

这个数组需要手动释放,这就是C++反对者会说C++不好的原因之一了

但是需要知道

a 本身也是个 UNIT变量,所以如果这句话在函数中出现,那么 a 的生命周期也是这个函数体。

但是a指向的数组内存是一直存在的,需要手动释放。

PS:你问的这个问题,和堆栈关系不大。

------解决方案--------------------

char *getABC()

{

char str[10];

strcpy(str,"12345");

return str; //理论上,这是错误的

}

void  print_data()

{

char str[80];

printf("str=%p",str);

}

void str_test()

{

char str[10];

char *s,*t;

char *p = getABC();

register int i;

for(s=p,t=str,i=0;i<10;i++)

*t++=*s++; //这么处理,可以勉强把数据复制出来,而不错误

printf("%s\n",str);   //输出是正确的,但是从C语言来说,却是错误的;

//因为返回的数组地址,是个超过生存周期的数组的地址,

//这个地址对应的内存,可能会另作他用比如,局部变量,调用函数传递的参数,函数返回地址等等

//这里  .str,"%s\n" 这两个参数,以及printf函数的局部变量;

//可能会占用p这个指针表示的地址.

//所以输出可能不正确.

printf("p = %p,",p);

}

------解决方案--------------------

第二种方法是正确的,因为strcpy的字符串实际上是拷贝到了main函数的数组str中。所以,在main函数里可以正确输出拷贝后的字符串。

------解决方案--------------------

char *getABC()

{

char *str="12345";//这样也对

//strcpy(str,"12345");

return str;

}

void main()

{

char *p = getABC();

printf("%s\n",p);   //这样正确吗?p 指向的位置是不是已被 自动释放了,

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

惯用并发:flatMap()与parallel()– RxJava常见问题解答

简单&#xff0c;有效和安全的并发是RxJava的设计原则之一。 然而&#xff0c;具有讽刺意味的是&#xff0c;它可能是该库中最容易被误解的方面之一。 让我们举一个简单的例子&#xff1a;假设我们有一堆UUID并且对于每个UUID &#xff0c;我们必须执行一组任务。 第一个问题是…

python%20开发工具_20招让你的Python飞起来!

今天分享的这篇文章&#xff0c;文字不多&#xff0c;代码为主。绝对干货&#xff0c;童叟无欺&#xff0c;主要分享了提升 Python 性能的 20 个技巧&#xff0c;教你如何告别慢Python。原文作者 开元&#xff0c;全栈程序员&#xff0c;使用 Python, Java, PHP和C。1. 优化算法…

c语言万能预编译,Objective-C学习笔记

import 指令(将文件的内容在预编译的时候拷贝到写指令的地方)import Foundation 框架NSLog 函数 NSLog("Hello, World!");NSString语法: NSString *str "jack";字符串占位符: %数据类型C 语言支持的数据类型基本数据类型int double float char构造类型数组…

Java命令行界面(第19部分):jClap

本系列中第19篇文章的重点是从Java代码解析命令行参数是jClap &#xff08; Java命令行参数解析器 &#xff09;&#xff0c;不应将它与称为JCLAP的库相混淆&#xff0c;而JCLAP库是我本系列先前文章的重点。 在以前的帖子覆盖JCLAP 1.4加尔斯吉尔温斯坦利&#xff08; snaq.ne…

使用Arquillian和LocalStack脱机测试AWS云堆栈

在AWS云堆栈 &#xff08;例如DynamoDB&#xff0c;S3等&#xff09;上构建应用程序时&#xff0c;需要针对这些组件编写测试。 您可能首先想到的是拥有一个用于生产的环境和一个用于测试的环境&#xff0c;然后针对该环境运行测试。 这对于集成测试&#xff0c;部署测试&…

python取文本中间_Python读取两个字符串之间的特定文本行

我无法让python读取特定的行。我正在做的事情是这样的&#xff1a;lines of data not neededlines of data not neededlines of data not needed--------------------------------------***** REPORT 1 *****--------------------------------------[key] lines of interest ar…

c语言7.5return的值是,这个真心搞不懂了。求助

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼回复 15楼. 假如你每天签到拿4经验&#xff0c;300000/475000天&#xff0c;如果从1岁开始签到&#xff0c;那100年36500天&#xff0c;你差不多要活200年保持每天签到(谁知道200年后还有没有签到这玩意)&#xff0c;如果你每天再水…

Java命令行界面(第22部分):argparser

John Lloyd的argparser是本系列的第二十二篇有关基于Java的命令行参数解析的文章中介绍的库。 该库的主页除了提供单个源代码示例外&#xff0c;还提供了指向基于Javadoc的API文档 &#xff0c;JAR文件&#xff0c;ZIP文件和TAR文件的链接。 本帖子中使用的示例与本系列的前二十…

python中布尔类型的值包括0和1_Python中布尔型变量的值为0和1。( )

【单选题】以下哪个不能作为字典的键。【多选题】以下哪些元素是可变序列。【单选题】已知 x[1,2,3,4,5,6,7],执行语句x.pop()的结果是()。【多选题】以下哪几个可以作为字典的键。【单选题】以下哪个属于列表的定界符。【多选题】以下哪几个选项类型属于元组。【单选题】下面代…

如何粗暴地下载huggingface_hub指定数据文件

参考这里&#xff1a; https://huggingface.co/docs/huggingface_hub/guides/download 可见下载单个文件&#xff0c;下载整个仓库文件都是可行的。 这是使用snapshot_download下载的一个例子&#xff1a; https://qq742971636.blog.csdn.net/article/details/135150482 sn…

顺序表输入栈元素c语言,C语言数据结构之栈简单操作

C语言数据结构之栈简单操作实验&#xff1a;编写一个程序实现顺序栈的各种基本运算&#xff0c;并在此基础上设计一个主程序&#xff0c;完成如下功能&#xff1a;(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称…

rete_Rete之外的生活– RIP Rete 2013 :)

rete我只是对我的新算法做最后的修改。 它融合了Leaps &#xff0c; 面向集合的Match和Left / Right取消链接的概念 &#xff0c;以及我自己的一些想法。 该代码已提交&#xff0c;但我正在积累工作并编写更多测试。 我将在一周左右的时间内写一个完整的博客&#xff0c;详细介…

25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势

存储虚拟化是一种对物理存储资源进行抽象的技术&#xff0c;使其看起来像是一个集中的资源。虚拟化掩盖了管理内存、网络、服务器和存储中资源的复杂性。存储虚拟化运行在多个存储设备上&#xff0c;使它们看起来就像一个单一的存储池。这些池化的存储设备可以来自不同的供应商…

android代码画出波浪球,Android绘制波浪曲线,效果很赞的。

github地址&#xff1a;https://github.com/sddyljsx/Android-SurfView-WaveViewpackage neal.canvas;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import and…

Java命令行界面(第14部分):google-options

google-options的GitHub页面指出google-options是“来自Google&#xff08;java&#xff09;的人们的命令行参数解析库。” 该页面继续说&#xff1a;“这是Bazel Project中的命令行参数解析器。 com.google.devtools.common.options程序包已拆分为一个单独的jar&#xff0c;用…

python自动化工具哪个好用_10款好用的自动化测试工具推荐

当我们功能测试干的时间比较久了,或者想要学习更多的技术,提升自己的时候,基本上第一时间就会想到的是自动化测试。而在自动化测试领域&#xff0c;自动化工具的核心地位毋庸置疑&#xff0c;下面为大家推荐10款常见常用的自动化测试工具&#xff1a;1、SeleniumWEB自动化测试S…

android 输入法文本选择功能,Android的文本和输入---创建输入法(一)

输入法编辑器(IME)是让用户输入文本的控件。Android提供了一个可扩展的的输入法的框架&#xff0c;它允许应用程序给用户提供另外的输入法&#xff0c;如软键盘或语音输入。这些输入法一旦安装&#xff0c;用户就可以从系统的设置中选择他们想要使用的IME&#xff0c;并且这个设…

python基础list_python基础操作---list

1 #coding:utf-82 list1 [physics, chemistry, 1997, 2000];3 list2 [1, 2, 3, 4, 5 ];4 list3 ["a", "b", "c", "d"];56 #切片功能跟str一样7 print "list1[0]: ", list1[0]8 print "list2[1:5]: ", list2[1:…

华为mate40RS能升级鸿蒙,mate40Pro和40RS能用上鸿蒙系统吗

[分享交流]mate40Pro和40RS能用上鸿蒙系统吗8886电梯直达huafen210861086新学乍练发表于 2020-12-18 12:30:08来自&#xff1a;HUAWEI Mate 40 Pro最新回复 2020-12-19 09:50:21如题好多人都说不能用上鸿蒙系统林泽徐独步江湖发表于 2020-12-18 12:30:52来自&#xff1a;HUAWEI…

在JShell中尝试Java9 HTTP客户端和Process API

这篇文章继续了My My Java 9 Features博客文章中对Java9功能的探索。 在这里&#xff0c;我们用在Java9 HTTP / 2客户端和进程API试验JShell HTTP / 2客户端 HTTP / 2客户端是Java9中的孵化器项目。 这意味着该API尚未最终确定&#xff0c;因此在将来的版本中仍有一定的更改范…