【问题标题】:c memory allocation and arrays of arraysc内存分配和数组数组
【发布时间】:2014-01-21 21:53:37
【问题描述】:

我目前正在编写一个基于终端的十六进制编辑器。我有几个关于内存分配的问题。

为了跟踪用户所做的更改,我将它们写入数组数组,如下所示,[i][0] 是更改从文件开头的绝对偏移量,[i][1] 是更改本身:

unsigned long long writebuffer[10000][2];

但我有两个问题。第一个数组 (writebuffer[i][0]) 需要是 sizeof unsigned long long,但第二个数组 ([i][1]) 可以像 sizeof unsigned char 一样小。有可能做这样的事情吗??

我也可以动态分配 writebuffer 的第一个索引,这样我就不会像上面那样初始化它,而是更像:

unsigned long long **writebuffer;

然后用malloc()realloc()更改第一个索引;而第二个索引为 2,但大小为 unsigned char

【问题讨论】:

  • 使用一个 unsigned long long 和一个 unsigned char 的结构?
  • 太容易了。是的,有效

标签: c memory-management malloc


【解决方案1】:

为什么不使用结构体?

typedef struct {
    long long offset;
    int change; /* or unsigned short, or whatever you feel is right */
} t_change;

请注意,如果您选择使用 unsigned char 作为更改元素,编译器可能会将结构填充为不同的大小。填充的内容取决于您的编译器、编译器设置和目标架构。

【讨论】:

  • 嗯,为什么 unsigned char 会被填充?我的更改总是只有 1 个字节长。所以最好让它们始终是 char 的大小。
  • @user3188237:该结构包含long long offset。在大多数 C 实现中,long long 对象需要在内存中对齐到四个字节或更多字节的倍数。如果结构的大小只是long long 的大小加上unsigned char 的大小,那么它将是九个字节。然后,该结构的数组将在距数组开头的 0、9、18、27、36 字节偏移处包含元素。这将强制某些offset 成员不对齐。这是不允许的。所以编译器填充结构以使倍数对齐。
  • 我明白了。另一个小问题。如果我想重新分配()一个由此制成的结构,我会使用什么?我想在添加更改之前执行此操作。 writebuffer=realloc(writebuffer(++wrcount)*sizeof(???));
【解决方案2】:

你可以定义一个 void 类型的数组:

void **writebuffer;

然后根据需要分配和使用每个元素,例如:

*writebuffer[0] = (char*)malloc(sizeof(char));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2018-07-14
    • 2012-03-23
    • 2021-04-02
    相关资源
    最近更新 更多