首先对于这个说明一下:返回的是数组a的地址,同时也保证了a绝对不等于NULL(空指针):
于是我们应该思考一个问题了:为什么当a的地址不是为NULL的时候为什么最后却是返回一个空指针呢?
而根据第二章图片的解释,可能有的人能够理解,有的人不能够理解。不管怎样在跟着让我们一起去深入了解一下其中的原因吧!
在了解之前我们在来看看这样一张图片:
通过这一张图片我们可以观察到的两个共同点是:两个函数的返回值都需要在main函数用到;
同时两者各自定义的函数内都定义了一个字符数组同时都是返回字符数组的地址。
那么类型都是一样的为什么我们的第一个是错误的呢?而第二个却是能够正确的返回在自定义函数里面定义的数组的地址,为什么会出现这种差别呢?
那么接下来我们带着这两个疑问开启我们今天的文章:
一:内存类型
首先我们来了解一下内存类型分类的问题及其各自会储存什么样的数据:
①:栈区:储存的是局部变量通常是由编译器自动分配和释放的
②:动态分配地址:如malloc函数等,这个分配的地址都是分配的是内存中叫做堆区的地方:这个地方的特点就是,你开辟的地址,如果你自己不给它释放不管函数是否结束,这个内存会一直在那里,除非你用函数free()给其释放
③:全局区和静态区(static)(这两个是放在一起的):这个地方储存的就是全局变量和静态变量的值;这个的特点就是如果函数不结束的话,这个内存就不会被释放就会一直的储存;数组一般都是全局变量,因此它也是储存到这个全局区;
了解完这些内容我们来看今天的问题:对于第一张图片来说:数组显然是放到全局区的:虽然说当函数结束之前已经返回了数组a的地址,但是在主函数中要用使用自定义函数的返回值(地址);首先要先让自定义函数结束,结束后这一片地址就会被释放(也就是讲里面存储的的值就被释放了);这样的话虽然说地址还在但是这个地址指向的内容确实不可能预料的。
而第二张图片所能够实现纯属是运气,具有不可预料性;
函数返回数值是没有问题的。
因此对于跨函数的指针传输最好使用动态地址分配空间。