【问题标题】:Get memory space for an array only initializing first item获取仅初始化第一项的数组的内存空间
【发布时间】:2016-02-16 16:18:39
【问题描述】:

我正在开发一个微控制器,所以,没有malloc。实际上,我想创建一个内存管理器,所以我有点实现malloc 函数供以后使用并使用BLOCK 策略 来获取它,就像 FreeRTOS 一样。

typedef struct BLOCK {
    unsigned char used;     // If 1 block is used, if 0 it's free to use
    unsigned long offset;   // Offset of the starting block
    unsigned long size;     // Size of this block
    struct BLOCK * next;    // Pointer to the next block
} BLOCK_t;

#define MAX_PROGRAMS    3
#define BLOCKS_NEEDED   (MAX_PROGRAMS * 2) + 1
BLOCK_t blocks[BLOCKS_NEEDED]; // Not allocating 7 * sizeof(BLOCK)

这个BLOCK 是一个链表,我想创建(分配)固定数量的它们并只设置第一个blocks[0]。下一个将在执行时创建,在分配内存时。

提前致谢。

编辑:如果标题不够清楚,我想编译器为我的数组分配一些内存空间(固定位置和大小),但我不想用数据初始化它因为我将在运行时获取数据,所以我想要一个包含 7 个 BLOCKs 的数组,其中包含空数据。上面的代码显示了我的尝试,我声明了数组,但我假设声明数组不会给你所需的空间。我怎样才能做到这一点?我怎样才能让编译器给我那个空间?

编辑 2:这将是 Java 代码来完成它。

private static int MAX_PROGRAMS = 3;
private static int BLOCKS_NEEDED = (MAX_PROGRAMS * 2) + 1:
Block myBlockList[] = new Block[BLOCKS_NEEDED];

即使列表为空且每个项目都未初始化,这也会为myBlockList 获得空间,但我已经有了空间。

【问题讨论】:

  • 问题是...??
  • FreeRTOS 提供了至少四种不同的分配器。一般来说,如果你真的不需要动态内存管理,你不应该实现它。 FreeRTOS 允许例如为任务静态分配内存(通常在 MCU 上的程序不超过一个。不知道这里的“程序”是什么意思)。
  • @LPs @EugeneSh。问题已更新。 @Olaf 在我的情况下,我将运行几个程序,所以我需要创建一个 malloc 函数来将它们加载到 RAM 中。我需要动态内存。
  • 使用cBLOCK_t blocks[BLOCKS_NEEDED];声明数组,sizeof(BLOCK_t)*BLOCKS_NEEDED字节被数组占用。
  • @LPs facepalm 是的。如果您将其写为答案,我会将其标记为正确答案。如果没有,我会在几个小时后自己发布。谢谢。

标签: c arrays initialization microcontroller freertos


【解决方案1】:

您要做的就是在堆栈上自动分配内存。

#include <stdio.h>

#define blockcontent_size 1024
#define blockcount 3

typedef struct
{
    unsigned char used;   
    unsigned long offset;
    unsigned long size; 
    unsigned data[blockcontent_size];
} BLOCK;

BLOCK blocks[blockcount];

int main()
{
    printf("memory available in one block %u\n", sizeof(blocks[0].data));
    printf("memory used for one block %u\n", sizeof(BLOCK));
    printf("memory used for all blocks %u\n", sizeof(blocks));

    return 0;
}

其实你不需要链表,只用索引即可。 这是否接近您的要求?

【讨论】:

  • 我不明白这将如何解决我的问题。我更新了这个问题,也许你可以检查一下并添加一些解释。谢谢。
【解决方案2】:

@LPs 引用:

使用c写BLOCK_t blocks[BLOCKS_NEEDED];你是在声明数组,sizeof(BLOCK_t)*BLOCKS_NEEDED字节被数组占用了。

所以我的声明:

BLOCK_t blocks[BLOCKS_NEEDED]; // Not allocating 7 * sizeof(BLOCK)

是错误的,它实际上确实分配了空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多