如果我在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结果是:组装的意义是什么?这个问题可以而且应该在不涉及具体实施的情况下得到回答。大会的目的是什么?这个问题可以,也应该,不用提及一个问题就可以回答 具体实施。