繁体   English   中英

返回指向数组的指针

[英]Returning a pointer to an array

我编写了一个函数,该函数创建一个数据表,将其元素初始化为0并返回一个指向数据表的指针。 但是,它不起作用。 有人可以向我解释一下,以便我了解我的问题所在。 这是我的代码:

#include <stdio.h>

// Here I create the data table and initialize it's elements
int* tabinit(int size) {
  int tab[size];

  for (int i = 0; i < size; i++)
    tab[i] = 0;
  return tab;
}

int main() {
  int* t = tabinit(10);

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

当函数终止时,其所有自动变量都超出范围

tab在这种情况下是一个自动变量,在函数终止时将超出范围。 现在,您将返回一个指向 本地数组指针 ,因此当数组超出范围时,您将发现自己有一个悬空的指针

您的编译器没有对此发出警告吗? 我在GCC中收到以下警告:

warning: function returns address of local variable [-Wreturn-local-addr]
   return tab;
          ^~~

首先,请确保您确实练习在函数中创建数组。 如果不是,则不需要,您只需在main中创建,然后将其传递给函数即可。

但是,如果您想练习,那么您真的需要动态分配该数组,如果您确实希望它在函数终止后仍然有效。 在这种情况下,只有在您告诉它时,数组才会释放其内存(因此请不要忘记释放)。

例:

#include <stdio.h>
#include <stdlib.h>


int* tabinit(int size) {
  int *tab = malloc(size * sizeof(int));

  for (int i = 0; i < size; i++)
    tab[i] = 0;
  return tab;
}

int main() {
  int* t = tabinit(10);

  for (int i = 0; i < 10; i++)
    printf("%d ", t[i]);
  printf("\n");

  // do NOT forget to free
  free(t);

  return 0;
}

输出:

0 0 0 0 0 0 0 0 0 0

PS:当您更熟悉malloc() ,建议您阅读以下内容: 我应该检查malloc()是否成功?

您永远不应返回指向本地对象的指针。 函数完成后,将释放本地对象,然后留下一个悬空指针(该指针未指向有效内存)。

一种方法是在main中创建对象,然后将其传递给init函数,如下所示:

void tabinit(int* tab, int size) {
  for (int i = 0; i < size; i++)
    tab[i] = 0;
}

int main() {
  int t[10];
  tabinit(t, 10);

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

这里:

// Here I create the data table and initialize it's elements
int* tabinit(int size) {
  int tab[size]; // <------- here

  for (int i = 0; i < size; i++)
    tab[i] = 0;
  return tab;    // <------- also here
}

正如gsamaras所说,在函数调用后,由tab指向的内容将超出范围。 您可以更改此行:

int tab[size];

通过:

int *tab;
tab = malloc(size * sizeof(int));

内容将被动态分配,然后在退出函数后保留。 但是,之后必须手动释放它( free(t) ),否则它将一直保留到程序结束(这可能会导致内存泄漏 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM