C 如何返回字符指针数组?我的代码有什么问题?

C 如何返回字符指针数组?我的代码有什么问题?,c,pointers,C,Pointers,我看到过与我的问题相关的类似帖子,但我找不到任何答案来理解这段代码中的错误 因此,我有一个返回类型不能更改的函数(对于案例1)。对于案例2,我想知道如何返回char*a[] #include <stdio.h> #include <stdlib.h> #include <string.h> char **myfunc(int n) { char **a = malloc(n * sizeof(char *)); int i, j = 1;

我看到过与我的问题相关的类似帖子,但我找不到任何答案来理解这段代码中的错误

因此,我有一个返回类型不能更改的函数(对于案例1)。对于案例2,我想知道如何返回
char*a[]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **myfunc(int n) {
    char **a = malloc(n * sizeof(char *));
    int i, j = 1;
    for (i = 0; i < n; i++)
        a[i] = malloc(9 * sizeof(char));
    for (i = 0; i < n; i++) {
        snprintf(a[i], 5, "%d", i);
        return a;
    }

int main() {
    int num = 10, i;
    char **ar = myfunc(num);
    for (i = 0; i < num; i++)
        printf("%s\n", ar[i]);

    return 0;
}
3) 在这两种情况下,我应该如何处理
main()
函数中的返回

案例2:

char*myfunc(int n){
静态字符*a[n];
int i;
对于(i=0;i
您的代码缩进错误,这使得阅读起来很困难,并且隐藏了愚蠢的错误,例如第二个
后面的括号

纠正此错误后,代码将编译并正常运行:

#包括
#包括
#包括
字符**myfunc(整数n){
char**a=malloc(n*sizeof(char*));
int i;
对于(i=0;i
如果将
myfunc()
更改为将
a
定义为
char*a[n]
,从
myfunc()
返回
a
时会出现一个大问题,因为数组仅在
myfunc()
的范围内定义。返回它的地址,简单地说就是
返回a
将导致
main()
中出现未定义的行为,因为它所指向的空间可能已被重新用于其他内容,例如
printf()
局部变量


第三个选项,将
a
定义为
静态字符*a[n]不编译,因为静态对象的大小必须在编译时已知。使用本地
静态
对象是不可取的,因为这会使程序更难理解、不可重入、内部状态隐藏等。其中一个函数是

中的
strtok()
,对于第一种情况,您究竟会遇到什么错误?一旦您纠正语法错误并包含所需的标题,它就完全符合gcc-Wall的要求。对于第二种情况,您试图返回堆栈上存在的指针数组。一旦
myfunc
返回,内存就会失效。您可以在参考中找到答案,请提供实际代码。第一个摘录缺少必要的include,有语法错误,无法产生您的问题。@Brian,您是对的。在我的Ubuntu机器上,它运行良好。但当我尝试在Windows上使用代码块运行时,我得到了以下警告:main.c | 20 |警告:从不兼容的指针类型返回[-Wincompatible指针类型]|@Саа我已经尝试过该方法。我得到一个错误分段错误,请参考上面的案例2代码。非常感谢。当我遵循静态声明时,我遇到了完全相同的问题,并猜测如果数组被声明为非静态,它将无法用于主函数。另一个观察结果是,当我在Ubuntu上使用gcc-Wall运行此代码时,我没有任何警告。但代码块(Windows)上的同一代码会抛出一个警告:从不兼容指针类型返回[-Wincompatible指针类型];对于语句返回a;原因可能是什么?@hago案例2的原型不正确:返回类型为
char*
,您返回的
a
定义为
静态char*a[n]
如果将
n
替换为
10
,则返回类型也应为
char**
char ???myfunc(int n) {
    char *a[n];
    for (i = 0; i < n; i++)
        a[i] = malloc(10 * sizeof(char));

   return ?
}
char *myfunc(int n) {
    static char *a[n];
    int i;

    for (i = 0; i < n; i++)
        a[i] = malloc(9 * sizeof(char));

    for (i = 0; i < n; i++)
        snprintf(a[i], 5, "%d", i);

    return a;
}

int main() {
    int num = 10, i;
    char *ar = myfunc(num);
    for (i = 0; i < num; i++)
        printf("%s\n", ar[i]);

    return 0;
}