c - 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;
}
解决方案
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**
所做的相同。您只需正确分配它。)argv
main
推荐阅读
- r - 跨数据框乘以列值
- python - 使用 Python 运行批处理文件时出现问题
- unity3d - 附加到搅拌机模型时纹理变得混乱
- python - 将文件夹上传到 Google 云端硬盘
- php - Laravel:使用 mergeBindings() 的复杂查询
- excel - Excel SUMPRODUCT/COUNTIFS #DIV/0 错误
- sql - 基于条件的 SQL 查询先前的值
- python - 如何使用 python 为远程 selenium webdrive 配置特殊代理设置?
- python-3.x - Azure Web 服务部署如何在本地工作?
- post - 从 Shopify 发送获取请求