Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在malloc之后执行任务但不执行memcpy,会有任何后果吗_C_Malloc_Memcpy - Fatal编程技术网

如果我在malloc之后执行任务但不执行memcpy,会有任何后果吗

如果我在malloc之后执行任务但不执行memcpy,会有任何后果吗,c,malloc,memcpy,C,Malloc,Memcpy,在以下程序中: int main() { struct Node node; struct Node* p = (Struct Node*) malloc(sizeof(struct Node)); *p =node; printf("%d\n", *p->seq); } 通常我做memcpyp、node、sizeofnode 现在我尝试了上面的代码,效果很好,如果我在malloc之后执行赋值而不是memcpy,恐怕会有任何后果或错误。 是否有任何错误或作业非常正确? 谢

在以下程序中:

int main()
{
  struct Node node;
  struct Node* p = (Struct Node*) malloc(sizeof(struct Node));
  *p =node;
  printf("%d\n", *p->seq);
}
通常我做memcpyp、node、sizeofnode

现在我尝试了上面的代码,效果很好,如果我在malloc之后执行赋值而不是memcpy,恐怕会有任何后果或错误。 是否有任何错误或作业非常正确?
谢谢

这很好,它可以为您复制。

这很好,它可以为您复制。

除非您遗漏了一些代码,否则作业是没有意义的

struct Node node; // uninitialized variable
struct Node *p = malloc(sizeof(struct Node));
*p = node; // copy an uninitialized variable to a new place
假设你是一名秘书,你的老板会给你指示:

从回收站拿些纸来

从回收箱中取出第二张纸

将第一张图纸的内容复制到第二张图纸上


这没有任何意义。注:memcpy本质上等同于此处的赋值。memcpy和赋值都是无意义的,因为节点未初始化。

除非您遗漏了一些代码,否则赋值是无意义的

struct Node node; // uninitialized variable
struct Node *p = malloc(sizeof(struct Node));
*p = node; // copy an uninitialized variable to a new place
假设你是一名秘书,你的老板会给你指示:

从回收站拿些纸来

从回收箱中取出第二张纸

将第一张图纸的内容复制到第二张图纸上


这没有任何意义。注:memcpy本质上等同于此处的赋值。memcpy和赋值都是无意义的,因为节点未初始化。

Jesus Ramos是正确的:

1*p=节点;将节点中的所有内容复制到*p

2您不需要一个无关的memcpy

3在进行复制之前,必须向malloc分配*p

下面是一个独立的测试:

// 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

耶稣·拉莫斯是正确的:

1*p=节点;将节点中的所有内容复制到*p

2您不需要一个无关的memcpy

3在进行复制之前,必须向malloc分配*p

下面是一个独立的测试:

// 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和分配结构之间的唯一区别是,如果分配一次作为元素实现,则不会保留存储在结构的任何填充位中的任何值。然而,这仅在您碰巧关心这些位存储的内容的罕见情况下才有意义,例如,如果您打算在之后在结构上使用memcmp。

直接赋值应该可以。一个实现实际上可以通过memcpy来实现它。根据ISO C99规范第6.2.6.1节脚注42:

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


使用memcpy和分配结构之间的唯一区别是,如果分配一次作为元素实现,则不会保留存储在结构的任何填充位中的任何值。然而,只有在您碰巧关心这些位存储了什么的罕见情况下,这才有意义。例如,如果您打算在之后在结构上使用memcmp。

忽略您正在复制未初始化的值这一事实,我认为您在赋值方面的立场是错误的

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

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

i = 42;
打电话给memcpy


总之,使用=assignment运算符执行赋值。

忽略复制未初始化值的事实,我认为您在赋值方面走错了方向

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

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

i = 42;
打电话给memcpy


底线是,使用=赋值运算符执行赋值。

我假设他是指他对结构进行堆栈分配并分配给它,在某一点上需要一些副本。我假设他是指他对结构进行堆栈分配并分配给它,在某一点上需要一些副本。不,但是对malloc的cast结果是:不,但是对malloc的cast结果是:组装的意义是什么?这个问题可以而且应该在不涉及具体实施的情况下得到回答。大会的目的是什么?这个问题可以,也应该,不用提及一个问题就可以回答 具体实施。