C函数返回(null)而不是返回数组

C函数返回(null)而不是返回数组,c,arrays,C,Arrays,我试图从一个函数返回一个二维数组。此代码一直返回null或以十六进制形式返回随机地址。如何返回哈希数组 #include <stdio.h> #include <stdlib.h> char **createBoard(); int main(void) { printf("%s", *createBoard(3)); } char **createBoard() { char** aa = malloc(sizeof(char[2]));

我试图从一个函数返回一个二维数组。此代码一直返回null或以十六进制形式返回随机地址。如何返回哈希数组

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

char **createBoard();

int main(void)
{
    printf("%s", *createBoard(3));
}

char **createBoard()
{
    char** aa = malloc(sizeof(char[2]));

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            aa[i][j] = '#';
        }
    }

    free(aa);

    return aa;
}
#包括
#包括
char**createBoard();
内部主(空)
{
printf(“%s”,*createBoard(3));
}
char**createBoard()
{
char**aa=malloc(sizeof(char[2]);
对于(int i=0;i<2;i++)
{
对于(int j=0;j<3;j++)
{
aa[i][j]=“#”;
}
}
免费(aa);
返回aa;
}

我执行您的代码时出现了分段错误

仍然存在一些问题,如内存泄漏和忽略arumging
3
,但除非
malloc()
calloc()
失败,否则此代码不会崩溃

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

char **createBoard();

int main(void)
{
    printf("%s", *createBoard(3));
}

char **createBoard()
{
    /* pointers will be stored, so the size calculation should be based of size of pointers */
    char** aa = malloc(sizeof(char*[2]));

    for (int i = 0; i < 2; i++)
    {
        /* allocate buffer for storeing the hashes */
        /* don't forget to allocate an extra element for terminating null-character */
        aa[i] = calloc(4, sizeof(char));
        for (int j = 0; j < 3; j++)
        {
            aa[i][j] = '#';
        }
    }

    /* the contents of aa will be used after being returned, so you must not free that */

    return aa;
}
#包括
#包括
char**createBoard();
内部主(空)
{
printf(“%s”,*createBoard(3));
}
char**createBoard()
{
/*指针将被存储,因此大小计算应基于指针的大小*/
char**aa=malloc(sizeof(char*[2]);
对于(int i=0;i<2;i++)
{
/*为存储哈希分配缓冲区*/
/*不要忘记为终止空字符分配额外的元素*/
aa[i]=calloc(4,sizeof(char));
对于(int j=0;j<3;j++)
{
aa[i][j]=“#”;
}
}
/*aa的内容将在返回后使用,因此您不能释放该内容*/
返回aa;
}

C函数不能返回数组。函数返回的是指针

最明显的问题是,您在返回指针值之前释放了指针。这将释放指针指向的任何对象,指针值本身将变得无效。(它不是空指针,只是无效指针。)

这将为2个
char
对象的数组分配空间(假设
malloc
没有失败,您应该进行检查)。您需要
sizeof(char*[2])
为两个
char*
指针对象分配空间。即使这样,它也不会分配空间来保存任何实际的字符数据。使用该修复程序,您已经创建了两个
char*
指针,但还没有为它们创建任何指向的对象。所以
aa[0]
aa[1]
char*
指针对象,但它们的值是垃圾

因此,本任务:

aa[i][j] = '#';
尝试写入垃圾指针指向的内存

即使为字符数组分配了内存,也为每个3元素字符数组的元素分配了值
“#”
。没有空终止符,因此如果您尝试将该数组视为字符串,则会出现未定义的行为。您的
printf
调用很可能会遍历内存搜索以查找
'\0'
字符,直到它碰巧找到一个字符,或者直到它因为没有访问该内存的权限而崩溃


(使用
char**
引用字符串数组很好。这与
main
中对
argv
所做的操作相同。您只需正确分配它即可。)

首先,您不能使用释放的内容。我猜编译器可以自由地优化所有内容,因为释放后使用是静态可证明且未定义的行为。您说过“如何返回哈希数组?”,但您的代码似乎试图返回哈希数组。你到底想做什么?有一些重要的问题你应该考虑。您希望使用
aa[i][j]
表达式访问哪些数据?您知道该子表达式是如何根据声明的
aa
类型解释的,即
(char**)
?您知道,您为
aa
分配了多少内存吗?您是否确保它对您的应用程序足够?双指针不是2D数组的类型,也不是2D数组类型衰减到的指针类型。代码只为两个
char
s分配足够大的空间,并将其分配给指向指针的指针。取消引用会产生未定义的行为,而取消引用其结果会产生三倍未定义的行为。另外,
printf(“%s”,x)
要求
x
指向以null结尾的字符串。更不用说,正如您的第一条评论所说,在程序使用完之前,不能释放分配的空间。@RobertSsupportsMonicaCellio完全正确。(我在来回滚动,我一定是从另一个答案而不是问题中得到的)。已修复。
malloc(2)
没有失败的原因。AFAIK
malloc()
行为是为大小等于零定义的实现,当它可能返回
NULL
或其他某个指针时(在这种情况下,指针不能被取消引用,但应该是
free
d)。但是,对于非零大小,
malloc()
被导出以返回指向已分配块的有效指针,只要有足够的可用内存用于请求的分配。@CiaPan:“只要有足够的可用内存用于请求的分配”。这正是它可能失败的原因。现在,一个非常小的分配不太可能失败,但作为一个风格问题,你应该经常检查<指定code>malloc在失败时返回空指针。(Linux在这方面有一些问题,但这是另一回事。)
aa[i][j] = '#';