【问题标题】:Why doesn't malloc allocate memory at all?为什么 malloc 根本不分配内存?
【发布时间】:2015-02-25 04:00:59
【问题描述】:

我有以下结构:

struct block {
    void *addr; /*start address of memory for this block */
    int size;
    struct block *next;
};

我有以下代码来初始化每个块:

void block_init(struct block *b, void *addr, int size){

    /*Allocate space and fill b with the initial data.*/
    b = (struct block *)malloc(sizeof(struct block));
    if(b){
        b->addr = addr;
        b->size = size;
        b->next = NULL; 
    }    
}

我正在从另一个函数调用以下行:

struct block *list;
block_init(freelist, mem, size);

但是,它从不初始化块。

我使用 gdb 来测试这个,但是每次我得到一个 NULL 指针:

123     b = (struct block *)malloc(sizeof(struct block);
(gdb) next
124     if(b){
(gdb) print b
$2 = (struct block *) 0x0
(gdb) print b->size
Cannot access memory at address 0x8

我不知道发生了什么,有人可以帮帮我吗?

【问题讨论】:

  • 您不需要在 C 程序中强制转换 malloc 的返回值。
  • 我有一种预感,你忘了在你的 .c 文件中 #include <stdlib.h>
  • 你只修改了局部变量b。你要么需要你的参数 b 是一个指向用 &list 调用的指针的指针(这样它就可以改变内容)或者(可能更容易)返回 malloced 块。
  • 另外,你需要阅读:c-faq.com/ptrs/passptrinit.html
  • @John3136:短语“双指针”是模棱两可的。您的意思是指向指针的指针,而不是 double*

标签: c linux memory malloc heap-memory


【解决方案1】:

你使用了block *,所以如果你改变b的值,它不会反映到调用函数。你应该使用block**

void block_init(struct block **b /*HERE*/, void *addr, int size){

    /*Allocate space and fill b with the initial data.*/
    *b /*AND HERE*/ = (struct block *)malloc(sizeof(struct block));
    if(*b){
        (*b)->addr = addr;
        (*b)->size = size;
        (*b)->next = NULL; 
    }    
}

调用函数,

block_init(&list , mem, size);//pass by address

【讨论】:

  • 一个明显无法编译的答案如何被接受?
【解决方案2】:

在不同意@pranit-kothari 所说的情况下,编写原始函数的一种可能更惯用的方式是

struct block* block_init(void *addr, int size) {
    /*Allocate space and fill b with the initial data.*/
    struct block* b = (struct block *)malloc(sizeof(struct block));
    if (b) {
        b->addr = addr;
        b->size = size;
        b->next = NULL; 
    }
    return b;
}

这避免了修改任何参数(我通常觉得这是一种“代码味道”),阅读起来更清晰,而且调用起来可能更整洁。

(顺便说一句,malloc 参数应该是 size * sizeof(struct block) 吗?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2019-11-18
    • 2014-04-24
    • 1970-01-01
    • 2013-07-04
    • 2021-10-16
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多