c内存分配和数组的数组

c内存分配和数组的数组,c,memory-management,malloc,C,Memory Management,Malloc,我目前正在编写一个基于终端的十六进制编辑器。我有一些关于内存分配的问题 为了跟踪用户所做的更改,我将它们写入一个数组中,如下所示,[I][0]是更改相对于文件开头的绝对偏移量,[I][1]是更改本身: unsigned long long writebuffer[10000][2]; 但我有两个问题。第一个数组(writebuffer[i][0])需要是无符号长字符的sizeof unsigned long,但第二个数组([i][1])可以小到无符号字符的sizeof unsigned cha

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

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

unsigned long long writebuffer[10000][2];
但我有两个问题。第一个数组(
writebuffer[i][0]
)需要是无符号长字符的
sizeof unsigned long
,但第二个数组(
[i][1]
)可以小到无符号字符的
sizeof unsigned char
。有可能这样做吗

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

unsigned long long **writebuffer;
然后用
malloc()
realloc()
更改第一个索引;而第二个索引将是2,但大小为
无符号字符

为什么不使用结构

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

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

您可以定义void类型的数组:

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

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

使用一个无符号long和一个无符号char的结构?太简单了。是的,这很有效。为什么要填充未签名的字符?我的更改总是只有1字节长。因此,最好使它们的大小始终为char。@user3188237:该结构包含一个
长偏移量
。在大多数C实现中,
long
对象需要在内存中与四个字节或更多字节的倍数的地址对齐。如果结构的大小正好是
long
的大小加上
无符号字符的大小,那么它大约是9个字节。然后,该结构的数组将在距数组开头0、9、18、27、36…字节的偏移量处包含元素。这将强制某些
偏移量
成员未对齐。这是不允许的。因此编译器填充结构,使倍数对齐。我明白了。另一个小问题。如果我想要realloc()一个由它生成的结构,我会使用什么?我想在添加更改之前执行此操作。writebuffer=realloc(writebuffer(++wrcount)*sizeof(??);