为struct分配内存

Jon*_*Jon 0 c struct

我有一个关于为c中的结构分配内存的一个相当简单的问题,我试过在网上看,但我找不到任何东西.结构定义为:

typedef struct cblock_ {
....
} cblock, *Cblock;
Run Code Online (Sandbox Code Playgroud)

分配内存时,我试过了

Cblock new_block = malloc(sizeof(struct cblock_));
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到内存损坏错误.我已经尝试将sizeof的参数更改为不同的东西,但一切都得到了相同的内存损坏错误.我究竟做错了什么?

****编辑****

因此在运行valgrind之后,我在代码中得到了相当多的"无效写入大小4"或"无效读取大小4".

发布所有内容可能太多了,但这里有一个地方,其中valgrinds给我一个"4号无效写入"

static Ablock agroup_main;    

typedef struct ablock_ {
    int length;
    int num;
    ...
} ablock, *Ablock;

void init_groups() {
    agroup_main = malloc(sizeof(Ablock));

    agroup_main->length = DEFAULT_GROUP_LENGTH;
    agroup_main->num = DEFAULT_GROUP_NUM;

}
Run Code Online (Sandbox Code Playgroud)

Valgrind在行设置长度上说它是大小为4的无效写入,并且在分配大小为4的块之后地址是0字节.对于num,它是相同的,除了地址是大小为4的块之后的4个字节.我也不太明白这一点,因为长度只是一个int,而对我来说,错误听起来像我想为它分配内存......

Bas*_*tch 5

内存损坏可能是因为较早的错误malloc(例如,尺寸太小),过早free或真正的缓冲区溢出(或未初始化的指针取消引用).

使用内存泄漏检测器.在Linux上,尝试valgrind

您malloc为Cblock看起来确定.这个bug可能在其他地方.不要忘记编译所有警告和调试信息(例如gcc -Wall -g).还可以使用调试器(例如gdb).您可能希望禁用ASLR以简化调试(并且具有更多可重现的运行).

你应该测试结果malloc:

cblock* new_block = malloc(sizeof(struct cblock_));
if (!new_block) { 
    perror("malloc cblock"); 
    exit(EXIT_FAILURE); 
}
Run Code Online (Sandbox Code Playgroud)

而且我认为你应该清楚地标记你代码中的所有指针(所以我更喜欢cblock*而不是Cblock让我感到困惑,哪些应该至少被命名CblockPtr).

顺便说一下,你被这种混乱所困扰:

    agroup_main = malloc(sizeof(Ablock));  // WRONG!
Run Code Online (Sandbox Code Playgroud)

是不正确的,因为Ablock是一个指针类型(在Linux/PC上,所有指针都有相同的大小,在x86-64上是8个字节).你的意思是

    agroup_main = malloc(sizeof(ablock));
    if (!agroup_main) 
       { perror("malloc ablock"); exit (EXIT_FAILURE); };
Run Code Online (Sandbox Code Playgroud)

你真的应该放弃以隐藏指针的方式命名指针类型的坏习惯(并且使用类似于指向数据的名称).

  • 我知道,但标记所有指针是恕我直言的重要.因此`Cblock`的可读性低于`cblock*`:你需要向代码的读者传达一些变量 - 或者 - 不是指针. (2认同)