【问题标题】:C++ make function return array cross fileC++ make函数返回数组交叉文件
【发布时间】:2019-02-27 12:32:25
【问题描述】:

我希望让一个函数返回一个设定大小的数组,并将该数组的值分配给另一个数组。该函数位于一个文件中,我将为其分配返回值的数组位于另一个文件中。

我正在尝试在 SFML 项目中执行此操作。每当我调用数组函数时,我的程序都会冻结并停止响应。

generate_maze.cpp:

#include <SFML/Graphics.hpp>
#include "generate_maze.h"

char* generate_maze() {

    char test_maze[169] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,
    0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0,
    0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,
    0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };

    return test_maze;

}

main.cpp 的提取:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <SFML/Graphics.hpp>

#include "controls.h"
#include "generate_maze.h"

...

char* maze = generate_maze();
std::cout << (int) maze[0] << std::endl;

generate_maze.h:

char* generate_maze();

提前感谢您的帮助。

【问题讨论】:

  • 你在找std::array
  • 您的generate_maze 函数正在返回一个指向在堆栈上分配的变量test_maze 的指针。这是未定义的行为,因为 test_maze 的生命周期仅与包含其定义的函数一样长。几种解决方案:在堆上分配、静态化、全局化等。

标签: c++ arrays file pointers


【解决方案1】:

代码不起作用,因为generate_maze() 返回一个指向局部变量的指针,该变量在退出函数时被销毁。为了让它工作,一个可以设计generate_maze()通过new分配一个char的数组,然后分配的数组在generate_maze()完成后仍然存在。但这也需要在不再使用 char *maze 之后显式释放内存。

一个更好的类c++解决方案如下。 如果数组的大小是固定的,最好使用std::array来存储generate_maze()的结果,如下:

#include <array> 

std::array<char, 169> generate_maze() {

    return { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,
    0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0,
    0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,
    0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
}

如果generate_maze()返回的数组大小不固定,正确的做法是使用std::vector,并将generate_maze()声明为

#include <vector>
std::vector<char> generate_maze();

【讨论】:

  • 感谢您的解决方案。
【解决方案2】:

generate_maze返回test_maze[0]的地址,是一个局部变量。你永远不应该从函数中返回(或引用)局部变量的地址。

改为在堆上分配迷宫并返回:

char* generate_maze() {
    char local[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,
    0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
    0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0,
    0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,
    0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
    0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
    0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
    char* ret = new char[sizeof local];

    memcpy(ret, local, sizeof local);

    return ret;
}

或者,只返回一个std::vector,它自己管理内存。

std::vector<char> generate_maze() {
    return {0, 0, 0, ...};
}

【讨论】:

    【解决方案3】:

    generate_maze() 返回指向本地数组的指针,该数组在函数退出时被销毁。
    为了解决这个问题,可以定义test_maze static:static char test_maze[]

    这将为所有generaze_maze() 函数调用创建一个永久数组。如果要实现generate_maze() 来返回不同的迷宫数组,最好使用std::vectorstd::array

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2012-09-26
      • 2015-04-22
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多