1

在以下程序中:

int main()
{
  struct Node node;
  struct Node* p = (Struct Node*) malloc(sizeof(struct Node));
  *p =node;
  printf("%d\n", *p->seq);
}

通常我会memcpy(p, node, sizeof(node))

现在我尝试了上面的代码,它工作正常,我担心如果我做分配而不是memcpy之后会有任何后果或错误的东西malloc。有没有或分配非常正确?谢谢!

4

5 回答 5

6

耶稣拉莫斯是正确的:

1)*p =node;将“node”中的所有内容复制到“*p”

2) 你不需要多余的“memcpy()”

3)在进行复制之前,您必须分配“*p”(使用“malloc()”)。

这是一个独立的测试:

// C source
#include <stdio.h>
#include <malloc.h>

struct Node {
    int a;
    int b;
    struct Node *next;
};

int
main() {
  struct Node node;
  struct Node *p = malloc(sizeof(struct Node));
  *p = node;
  return 0;
}


# Resulting assembler
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $20, %esp
        movl    $12, (%esp)
        call    malloc
        movl    %eax, -8(%ebp)
        movl    -8(%ebp), %edx
        movl    -20(%ebp), %eax
        movl    %eax, (%edx)
        movl    -16(%ebp), %eax
        movl    %eax, 4(%edx)
        movl    -12(%ebp), %eax
        movl    %eax, 8(%edx)
        movl    $0, %eax
        addl    $20, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
于 2013-05-19T20:31:50.753 回答
4

直接分配应该没问题。一个实现实际上可以通过memcpy. 来自 ISO C99 规范第 6.2.6.1 节的脚注 42:

因此,例如,结构分配可以一次一个元素或通过 来实现 memcpy

memcpy使用和分配之间的唯一区别struct是分配(如果实现为一次元素)将不会保留存储在任何填充位中的任何值到struct. 但是,这仅在您碰巧关心这些位存储的内容(例如,如果您打算以后使用)的罕见情况下才有memcmp意义struct

于 2013-05-19T20:37:29.557 回答
3

这会很好地为您完成副本。

于 2013-05-19T20:17:37.993 回答
2

除非您遗漏了一些代码,否则分配是没有意义的。

struct Node node; // uninitialized variable
struct Node *p = malloc(sizeof(struct Node));
*p = node; // copy an uninitialized variable to a new place

想象你是一名秘书,你的老板给你指示:

  1. 从回收箱中取出一些纸。

  2. 从回收箱中取出第二张纸。

  3. 将第一张纸的内容复制到第二张纸上。

这没有任何意义。注意memcpy()本质上等同于这里的赋值。memcpy()和赋值都是没有意义的,因为是node未初始化的。

于 2013-05-19T20:21:52.497 回答
0

忽略您正在复制未初始化的值这一事实,我认为您在分配方面有错误的结局。

赋值意味着使用赋值运算符来执行。赋值是语言的核心部分,因此设计者提供了一流的运算符来执行它。使用该运算符 = 来执行赋值。

在许多情况下,您可以使用 memcpy 执行分配,但您为什么要这样做?它更加冗长,对读者来说完全不透明。你永远不会取代

i = 42;

调用 memcpy。

最重要的是,使用 = 赋值运算符执行赋值。

于 2013-05-19T20:40:03.667 回答