gpt4 book ai didi

c - 返回指向数组的指针

转载 作者:行者123 更新时间:2023-12-02 09:10:11 25 4
gpt4 key购买 nike

我编写了一个函数,用于创建数据表、将其元素初始化为 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 在这种情况下是一个自动变量,当函数终止时将超出范围。现在,您将返回一个指向本地数组指针,因此当数组超出范围时,您会发现自己有一个 dangling pointer

你的编译器没有警告你这个吗?我在 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() 时,我建议您阅读以下内容:Should I check if malloc() was successful?

关于c - 返回指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53285593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com