我正试着用C语言做一个迷宫生成器,但由于某种原因我收到了警告.如果答案与内存分配有关,请详细解释,因为我不知道它是如何工作的.

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

unsigned char ** gen(int w, int h){
    unsigned char maze[w+2][h+2];

    for(int i=0; 1<w; i++){
        if(i==0 || i==w-1){
            for(int j=0; j<h; j++){
                maze[i][j]=1;
            }
        }else{
            for(int j=0; j<h; j++){
                if(j==0 || j==h-1){
                    maze[i][j]=1;
                }else{
                    maze[i][j]==0;
                }
            }
        }
    }
    return maze;
}

我在互联网上四处寻找,但没有找到任何有用的东西.

推荐答案

这里有两个主要问题.

首先,您试图从一个期望返回类型为unsigned char **的函数返回一个类型为unsigned char [w+2][h+2]的array.这些类型不兼容.

虽然数组确实衰减为指向其第一个元素的指针,但这只适用于最外层的维度,而不是所有维度.因此,类型unsigned char [w+2][h+2]的数组实际上衰减为类型unsigned char (*)[h+2]的指针,即指向大小为h+2usigned char数组的指针,而这种类型与unsigned char **不兼容.

其次,您试图返回一个指向局部变量的指针,在本例中是2Darray.该数组的生命周期将在函数返回时结束,因此try 使用返回的指针将触发undefined behavior.

您可以通过为2D数组动态分配空间来修复本地返回问题:

unsigned char (*maze)[h+2] = malloc((w+2) * sizeof *maze);

对于返回类型不匹配,您可以将函数更改为返回指向数组的指针:

unsigned char (*gen(int w, int h))[] {

并将返回值赋给正确类型的指针:

unsigned char (*m)[h+2] = gen(w,h);

请注意,这里的函数返回一个指向未指定大小的数组的指针.这是必要的,因为指向的数组的大小在编译时是未知的.但是,它是有效代码,因为它被允许在指向已知大小的数组的指针和未指定大小的数组之间进行转换.

顺便说一句,您在函数的开头有一个错误:

for(int i=0; 1<w; i++){

这应该是:

for(int i=0; i<w; i++){

而这并不起任何作用:

maze[i][j]==0;

相反,它应该是:

maze[i][j]=0;

C++相关问答推荐

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

为什么写入系统调用打印的字符数不正确?

数据包未从DPDK端口传输到内核端口

如何一次获取一个字符

测量ARM MCU中断延迟的问题

#If指令中未定义宏?

从纯C中访问通用项对话框

如何知道我是否从非阻塞套接字读取所有内容

C中的指针增量和减量(*--*++p)

正确的TCP/IP数据包 struct

获取每个循环迭代结束时的当前时间

在Apple Silicon上编译x86的Fortran/C程序

在C++中父进程和子进程中的TAILQ队列同步问题

C中的空指针是什么(_N)?

在Ubuntu上使用库部署C程序的最佳实践

将size_t分配给off_t会产生符号转换错误

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

分支预测和UB(未定义的行为)

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

在 C/C++ 中原子按位与字节的最佳方法?