如果我在malloc之后做赋值而不做记忆会有什么后果吗?



在下列程序中:

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

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

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

Jesus Ramos是正确的:

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

不需要额外的"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

直接赋值就可以了。一个实现实际上可以通过memcpy实现它。来自ISO C99规范第6.2.6.1节的脚注42:

因此,例如,结构赋值可以一次一个元素地实现,也可以通过memcpy .

使用memcpy和赋值struct之间的唯一区别是赋值(如果以一次一个元素的方式实现)不会保留存储在struct填充位中的任何值。然而,这只会在你碰巧关心这些位存储什么的不常见的情况下(例如,如果你打算在struct上使用memcmp)。

它会很好地为你复制。

除非您省略了一些代码,否则赋值是没有意义的。

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是未初始化的。

忽略你正在复制一个未初始化的值这一事实,我认为你在赋值方面得到了错误的结果。

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

在许多情况下,你可以使用内存来执行赋值,但为什么要这样做呢?它冗长得多,对读者来说完全不透明。你永远不会替换

i = 42;

调用memcpy。

底线,使用=赋值操作符执行赋值。

相关内容

  • 没有找到相关文章

最新更新