小编Gia*_*ian的帖子

如何处理 malloc 失败并返回 NULL?

我对如何检查内存分配是否失败以防止由取消引用的NULL指针引起的任何未定义行为感到有些困惑。我知道malloc(和类似的函数)可能会失败并返回NULL,因此在继续执行程序的其余部分之前,应始终检查返回的地址。我不明白的是处理此类案件的最佳方法是什么。换句话说:当malloc调用返回时程序应该做什么NULL

当这个疑问出现时,我正在研究双向链表的这种实现。

struct ListNode {

    struct ListNode* previous;
    struct ListNode* next;
    void* object;
};

struct ListNode* newListNode(void* object) {

    struct ListNode* self = malloc(sizeof(*self));

    if(self != NULL) {

        self->next = NULL;
        self->previous = NULL;
        self->object = object;
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

节点的初始化仅在其指针被正确分配时发生。如果这没有发生,则此构造函数返回NULL

我还编写了一个函数,该newListNode函数从一个已经存在的节点开始创建一个新节点(调用该函数),然后返回它。

struct ListNode* createNextNode(struct ListNode* self, void* object) {

    struct ListNode* newNext = newListNode(object);

    if(newNext != NULL) {

        newNext->previous = self;

        struct ListNode* oldNext …
Run Code Online (Sandbox Code Playgroud)

c memory malloc memory-management out-of-memory

4
推荐指数
1
解决办法
1276
查看次数

使用 memcpy 和 offsetof 复制结构的一部分

我想通过组合offsetof宏和memcpy,从某个元素开始向前复制结构的一部分,如下所示:

#include <stdio.h>
#include <string.h>
#include <stddef.h>

struct test {

  int x, y, z;
};

int main() {

  struct test a = { 1, 2, 3 };
  struct test b = { 4, 5, 6 };

  const size_t yOffset = offsetof(struct test, y);

  memcpy(&b + yOffset, &a + yOffset, sizeof(struct test) - yOffset);

  printf("%d ", b.x);
  printf("%d ", b.y);
  printf("%d", b.z);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望这会输出,4 2 3但它实际上输出4 5 6好像没有发生复制一样。我做错了什么?

c offsetof memcpy

0
推荐指数
1
解决办法
91
查看次数

标签 统计

c ×2

malloc ×1

memcpy ×1

memory ×1

memory-management ×1

offsetof ×1

out-of-memory ×1