C 返回指向数组的指针
我编写了一个函数,用于创建数据表,将其元素初始化为0,并返回指向数据表的指针。但是它不起作用。谁能给我解释一下,让我明白我的问题在哪里。 这是我的代码: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
#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)
totabinit(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));