您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 栈区 >

C语言 被调用函数里栈区分配的内存主调用函数是不能使用的

发布时间:2019-07-07 21:51 来源:未知 编辑:admin

  老师说是因为被调用函数里栈区分配的内存,主调用函数是不能使用的

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部fun2.首先字符串“char*p表示被调函数在栈区分配一个字节的内存,p中的内容是常量区字符串“abcde”的首地址,函数二调用结束时栈区被回收,而p作为返回值保存下来,常量区的“abcde”也没有受到影响,所以可以在主函数中使用。

  fun3.中char str[]的含义是被调函数在栈区分配6个字节内存,然后把常量区的“abcde”拷贝到栈区分配的内存中,此时的str指向的是栈区中的“abcde”的首地址,而不是常量区中“abcde”的首地址,所以在调用结束时(当在主函数中调用其他函数时意味着前一个调用的函数栈区回收VS2013),str作为返回值被保存下来,而str所指向的内存空间已经被回收掉了。此时在主函数中用str[i]就不可能输出得到想要的结果了。

  这也正是数组名指针与普通指针的一个区别。(还有一个区别就是数组名指针是常量指针不能改变指向)

  展开全部我是这么理解的,函数调用返回值也会根据类型分配一段内存空间,fun1的返回值类型是int型,程序会分配4个字节用于保存int型的返回值,而a是个整形,它的值在内存释放前赋值拷贝给了返回区空间。

  fun2和fun3的返回值类型是char *,程序会分配4个字节的内存空间保存返回值,这个值存储的是一个地址,而 p = “abcde”指向的是常量区,在函数调用结束前将p指向的地址(假如是0X00000111)拷贝给了返回值区间,函数调用结束后虽然释放了局部变量p所占的空间,但函数返回值空间保存的是拷贝过来的地址(依然是0X00000111),而这个地址所指向的内存区并没有释放,所有p可以看到指向的是abcde

  而fun3拷贝的是局部变量str所存储的地址(假如是0x00002222),函数调用结束时会释放局部变量str的分配的内存,这个时候0x00002222所指向的内容就不确定了,因为它被回收了...所有如果调用fun3,它的返回值是不确定的

  展开全部非指针和地址操作的函数参数和返值,都是赋值操作,而不是地址操作。

  fun1出来后,变量a是无效了,但返值相当于一个被a赋值的临时变量,而不是返回了a的地址。

http://theenigmaco.com/zhanqu/287.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有