gpt4 book ai didi

编译器在返回 char 指针数组时提示

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:23 24 4
gpt4 key购买 nike

我试图返回一个 char 指针数组,但编译器似乎不喜欢它。

char*[] get_multiple(int x) {
char *tmp[x];
int i;
for (i=0;i<x;i++)
tmp[i]=strdup("abc");
return tmp;
}

编译器错误如下:

error: expected identifier or '(' before '[' token 

第 1 行

知道为什么编译器不喜欢它以及如何修复它吗?
(我知道我也可以从调用者传入一个结构来存储返回指针,但我想避免这样做)

最佳答案

请允许我添加到@Lidong Guo 的回答(引用如下)

You can't create a array by :char * tmp[x],since x is known runtime!

use char **tmp = malloc(x*sizeof(char *)); instead

通过查看您的代码,我发现您误解了数组标签 tmp 的含义实际上代表或在哪里 tmp实际位于。

当您在函数中分配变量(或static 大小的数组)时,它存储在堆栈 中,在您当前的堆栈框架 。一旦函数返回,这个堆栈框架就会被销毁/释放,你不应该再使用/引用那个内存!!!

tmp是一个标签,表示 tmp 所在的内存地址数组位于。这是在堆栈上,所以当你的函数返回时它不再是一个有效的指针!

如果您已经知道这一点,请原谅我,但从您的术语来看,我怀疑您可能不知道。

在 C 中,您不能将数组分配给其他数组!

int array1[10], array2[10];

// ... Put some values into array 1 ...

array2 = array1; // ILLEGAL! DOES NOT COPY AN ARRAY

同样,如果你返回tmp你返回的是地址,而不是数组,所以如果你将它分配给另一个变量,你应该复制它而不是分配它!

因此 C 不允许您返回数组,您应该返回指针

但即使您返回一个指向 tmp指针你会因为你试图分配它的方式(在堆栈上)而遇到麻烦所以@Lidong Guo 建议你将它分配在堆上,即使在你的函数返回后它也可以存在。但是,这意味着您需要记住释放该内存!

所以使用@Lidong Guo 的代码重写你的函数看起来像

char** get_multiple(int x) {
char **tmp = malloc(x * sizeof(char*));
int i;
for (i=0;i<x;i++)
tmp[i]=strdup("abc");
return tmp;
}

假设的 main 会像这样使用它:

int main()
{
char** multiple7;

multiple7 = get_multiple(7);

// Do some stuff on multiple 7
free(multiple7[3]);

// Do some more stuff ...

// Don't forget to free multiple7 array memory too
free(multiple7);

return 0;
}

关于编译器在返回 char 指针数组时提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17983531/

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