C 从函数返回指针作为静态变量

C 从函数返回指针作为静态变量,c,arrays,function,pointers,static,C,Arrays,Function,Pointers,Static,我在学习C和阅读 #包括 #包括 /*函数生成并重新运行随机数*/ int*getRandom(){ 静态int r[10]; int i; /*播种*/ srand((无符号)时间(NULL)); 对于(i=0;i

我在学习C和阅读

#包括
#包括
/*函数生成并重新运行随机数*/
int*getRandom(){
静态int r[10];
int i;
/*播种*/
srand((无符号)时间(NULL));
对于(i=0;i<10;++i){
r[i]=rand();
printf(“%d\n”,r[i]);
}
返回r;
}
/*调用上述定义函数的主函数*/
int main(){
/*指向整数的指针*/
int*p;
int i;
p=getRandom();
对于(i=0;i<10;i++){
printf(“*(p+[%d]):%d\n”,i,*(p+i));
}
返回0;
}
本文解释说,由于函数中声明的指针是局部变量,因此必须将其定义为“静态”。(第7行,变量r)

我有三点担心

  • 首先,“static int r[10]”声明他们想要创建一个大小为10的int数组。当使用“return r”从getRandom函数返回时,函数实际上返回r[10]的第一个成员的地址,或者返回指向r[10]的第一个地址的指针

  • 其次,在main函数中,p=getRandom()意味着从getRandom()返回的地址或指针被分配给指针p。即使getRandom()停止工作时r将发出poof,该地址也将被分配给p。那么,为什么需要声明为静态呢

    或者getRandom()将地址返回到指向r[10]的指针,因此当消失时,p将指向空地址而不是r[10]

    或者,当getRandom()停止时,不仅指向r的指针,而且r[10]数组都会消失,所以它需要是静态的

  • 第三,没有malloc声明的任何函数中的变量都将存储为堆栈内存,这是否正确

getRandom()
返回指向
r[10]
的第一个元素的指针

引用6.3.2.1左值、数组和函数指示符

3除非它是sizeof运算符或一元&运算符的操作数,或是 字符串文字用于初始化数组,类型为“”的数组类型“”的表达式为 已转换为类型为“指向类型的指针”且指向的初始元素的表达式 数组对象,并且不是左值。如果阵列对象具有寄存器存储类,则 行为是未定义的

如果
r[10]
不是
静态的
,那么从
getRandom()
返回并访问之后,数组将消失,并调用未定义的行为

“任何未声明malloc的函数中的变量都将存储为堆栈内存”是不正确的。C中的任何变量都不需要存储为堆栈内存。通常,静态变量不存储在堆栈上,而具有自动存储持续时间的变量存储在堆栈上

该函数实际返回r[10]的第一个成员的地址,或指向r[10]的第一个地址的指针

A:第一位成员的地址

即使在getRandom()停止工作时r将发出砰砰声

答:不,
静态
变量不会进入程序堆栈内存(与局部变量不同)。它们在程序执行的整个过程中都存在

第三,没有malloc声明的任何函数中的变量都将存储为堆栈内存,这是否正确

简言之,是的。OTOH,
malloc()
-ed内存寿命不受函数范围的限制

本文解释说,由于函数中声明的指针是 局部变量,因此必须将其定义为“静态”。(第7行, 变量r)

r
是整数数组,而不是指针。而local不一定意味着
静态
,这意味着另一种含义

该函数实际上返回 r[10],或指向r[10]的第一个地址的指针

它返回第一个成员的地址:当您键入
returnr
时会自动发生这种情况,这相当于更详细的
return&r[0]


static
变量从程序开始就存在,并在程序结束时被销毁——因此在
main
之前和
main
之后。要返回指向本地数据的指针(如从函数返回),它必须是
静态的
,否则-正如您所说-您将访问不允许的解除分配的数据。

这是一个很长的问题。我建议读一本好的C编程书,用警告和调试信息编译你的示例(
gcc-Wall-Wextra-g
如果使用…),然后在调试器中一步一步地运行你的示例(
gdb
),并查询有趣的变量的值,就像教程一样,其中有一个可怕的错误。要了解我的意思,请连续调用
getRandom()
至少三次,并比较它发出的数字……我认为在这种情况下引用标准是不值得的,也没有意义。因此,
static
变量的存储位置不是由标准指定的,它可能在堆栈上?
#include <stdio.h>
#include <time.h>

/* function to generate and retrun random numbers. */
int * getRandom( ) {

   static int  r[10];
   int i;

   /* set the seed */
   srand( (unsigned)time( NULL ) );

   for ( i = 0; i < 10; ++i) {
      r[i] = rand();
      printf("%d\n", r[i] );
   }

   return r;
}

/* main function to call above defined function */
int main () {

   /* a pointer to an int */
   int *p;
   int i;

   p = getRandom();

   for ( i = 0; i < 10; i++ ) {
      printf("*(p + [%d]) : %d\n", i, *(p + i) );
   }

   return 0;
}