Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回指向数组的指针_C_Arrays_Function_Pointers - Fatal编程技术网

C 返回指向数组的指针

C 返回指向数组的指针,c,arrays,function,pointers,C,Arrays,Function,Pointers,我编写了一个函数,用于创建数据表,将其元素初始化为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

我编写了一个函数,用于创建数据表,将其元素初始化为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;
}
#包括
//在这里,我创建数据表并初始化它的元素
int*tabinit(int大小){
int制表符[大小];
对于(int i=0;i
当函数终止时,其所有自动变量都会超出范围

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;
}
#包括
#包括
int*tabinit(int大小){
int*tab=malloc(size*sizeof(int));
对于(int i=0;i
输出:

0 0 0 0 0 0 0 0 0 0


PS:当您更加熟悉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;
}
void tabinit(int*tab,int size){
对于(int i=0;i
此处:

// 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
}
作者:


内容将动态分配,然后在退出功能后保留。但是,您必须在之后手动释放它(
free(t)
),否则它将保留到程序结束时(可能发生a)。

重复,解释每一行???更改
tabinit(&t,10)
to
tabinit(t,10)。我喜欢你的答案,但是你上次的编辑是错误的,所以请修复它。@gsamaras为什么我们不能在这里使用&t?@MisterTusk,因为参数类型是
int*
,而
t
是一个数组。这是不相容的。我建议你把它编译出来,读一下警告信息,这很有启发性!听起来你的“malloc()”编辑和我的答案在2分钟内得到验证,所以几乎同时。。。我现在不知道我的答案该怎么办。唯一不重复的部分是关于内存泄漏问题的一行。@Amesshiel我认为你的答案很有用,因为它丰富了图形内容。:)@gsamaras你能给我解释一下这条线是做什么的吗?
int*tab=malloc(size*sizeof(int))
@MisterTusk它动态分配与
size*sizeof(int)
一样大的内存,并使
选项卡
指向该内存
sizeof(int)
是一个数字,在不同的机器中可能会有所不同。例如,在您的示例中,它可能是4。
int tab[size];
int *tab;
tab = malloc(size * sizeof(int));