如何检测内存是否已分配? (链接列表)

时间:2017-10-23 21:09:59

标签: c memory linked-list malloc

我想创建一个将元素添加到链表末尾的函数。如果元素成功添加,它也必须返回0,如果元素没有分配/保存,则返回1。

问题是,我如何知道内存是否已成功分配或元素是否已成功添加?这是代码:

int push_back(pos_t *head, int new_value) {
    pos_t *temp = head;

    while (temp->next != NULL) {
        temp = temp->next;
    }
    pos_t *temp1 = (pos_t *)malloc(sizeof(pos_t));
    temp1->data = new_value;
    temp1->next = NULL;
    temp = temp1;
}

2 个答案:

答案 0 :(得分:1)

您需要添加以下代码

if (temp1 == NULL) { return 1; }

因为malloc被定义为返回指向已分配内存的指针,或

  • 如果大小为零,则返回NULL。
  • 出错,返回NULL。

您可以控制不要求大小为零,因此如果使用正大小并且malloc返回NULL,则可以推断出发生错误。

许多系统都有"手册"安装。如果您使用的是Linux系统,请使用命令" man malloc"将拉出malloc的手册页。如果您正在使用Windows系统,则the manual for malloc的网络搜索将为您提供足够的详细信息来处理详细信息。

答案 1 :(得分:0)

该函数有一个缺点:它不能用于分配列表中的第一个节点,即列表是否为空。

原型应改为

int push_back(pos_t **headp, int new_value);

传递列表指针的地址而不是其值。

测试malloc()失败很简单:juts将返回的指针与NULL0进行比较。

以下是相应的代码:

int push_back(pos_t **headp, int new_value) {
    pos_t *temp = *headp;
    pos_t *temp1 = malloc(sizeof(pos_t));
    if (temp1 == NULL) {   // allocation failure
        return 1;
    }
    temp1->data = new_value;
    temp1->next = NULL;

    if (temp == NULL) {      // empty list
        *headp = temp1;
    } else {
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = temp1;  // append node to the end of the list
    }
    return 0;
}