首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从函数返回数组(C)

从函数返回数组(C)
EN

Stack Overflow用户
提问于 2016-10-16 22:36:35
回答 5查看 196关注 0票数 1

我对C编程非常陌生,正在学习一些教程。有一件事让我感到困惑,那就是返回一个指向数组的指针。为了更好地说明我的观点,我减少了function.htm中的示例。

代码语言:javascript
复制
#include <stdio.h>

int * getRandom( ) {

   static int  r[10];
   int i;

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

int main () {
   int *p;
   int i;
   p = getRandom();
   for ( i = 0; i < 10; i++ ) {
      printf( "*(p + %d) : %d\n", i, *(p + i));
   }
   return 0;
}

正如人们所预料到的,这些指纹

代码语言:javascript
复制
r[0] = 0
r[1] = 1
r[2] = 2
r[3] = 3
r[4] = 4
r[5] = 5
r[6] = 6
r[7] = 7
r[8] = 8
r[9] = 9
*(p + 0) : 0
*(p + 1) : 1
*(p + 2) : 2
*(p + 3) : 3
*(p + 4) : 4
*(p + 5) : 5
*(p + 6) : 6
*(p + 7) : 7
*(p + 8) : 8
*(p + 9) : 9

但当你改变

代码语言:javascript
复制
   static int  r[10];

代码语言:javascript
复制
   int  r[10];

而是打印

代码语言:javascript
复制
r[0] = 0
r[1] = 1
r[2] = 2
r[3] = 3
r[4] = 4
r[5] = 5
r[6] = 6
r[7] = 7
r[8] = 8
r[9] = 9
*(p + 0) : 0
*(p + 1) : 1980517315
*(p + 2) : -1164399724
*(p + 3) : 4199040
*(p + 4) : 4199040
*(p + 5) : 2285568
*(p + 6) : 19
*(p + 7) : 6356668
*(p + 8) : 8
*(p + 9) : 6356940

我也不知道为什么。我唯一能想到的是,由于某种原因,编译器将数组单元格读取为不同的数据类型,但我怀疑这是正确的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-10-16 22:40:28

static关键字用于“记住”下一次调用中r的值。如果删除它,则在函数返回时会刷新分配给r的内存,因此您只是返回垃圾。

票数 1
EN

Stack Overflow用户

发布于 2016-10-16 22:40:29

当您拥有static int r[10];时,用于存储数组的内存将在编译时分配,并且一切都按预期工作。

当您拥有int r[10]时,您将在运行时堆栈框架上分配数组,当函数调用返回时,该数组将变得无效,然后被下一个函数调用覆盖,因此您会看到垃圾。

票数 1
EN

Stack Overflow用户

发布于 2016-10-16 22:49:35

原因是当您调用getRandom()而没有静态数组声明时,一旦getRandom()函数返回,该数组就会超出范围。这意味着您的指针可能不再“指向”r,因为r基本上被丢弃。

为了正确地从getRandom()返回,您需要使用malloc动态分配内存,例如:

代码语言:javascript
复制
int * getRandom( ) {
  int *r = NULL;
  r = malloc(sizeof(int) * 10); /* Create room for 10 integers*/
  if (r == NULL) {
    printf("Error: Could not allocate space\n");
    return NULL;
  }
  int i;
  for ( i = 0; i < 10; ++i) {
    r[i] = i;
    printf( "r[%d] = %d\n", i, r[i]);
  }  
  return r; /* Returns a pointer to r*/
}

int main () {
  int *p;
  int i;
   p = getRandom();
   if (p == NULL) {
     /*Error state*/
     return 1;
   }
   for ( i = 0; i < 10; i++ ) {
     printf( "*(p + %d) : %d\n", i, *(p + i));
   }
   free(p); /* Free the memory we allocated*/
  return 0;
}

注意我们必须如何free我们分配的内存(否则就会有内存泄漏)。还要注意,我们必须处理NULL情况,在这种情况下,我们无法分配所需的内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40076239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档