[英]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.