首页 > 解决方案 > C函数返回(null)而不是返回数组

问题描述

我正在尝试从函数返回一个二维数组。此代码不断返回 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;
}

标签: carrays

解决方案


AC 函数不能返回数组。你的函数返回的是一个指针。

最明显的问题是您free在返回其值之前的指针。这将释放指针指向的任何内容,并且指针值本身变得无效。(它不会是一个空指针,只是一个无效的。)

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

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

所以这个任务:

aa[i][j] = '#';

尝试写入垃圾指针指向的内存。

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

(使用 a来引用字符串数组很好。这与inchar**所做的相同。您只需正确分配它。)argvmain


推荐阅读