C 结构赋值:段错误11
然后,将此行更改为:C 结构赋值:段错误11,c,struct,clang,C,Struct,Clang,然后,将此行更改为: *foo2 = *foo1; 它起作用了 然后我尝试用gcc编译这两个案例,没有问题。对于struct foo,alloc\u foo\u节点返回的值可能没有正确对齐 在我的系统上,打印\u Alignof(struct foo)会得到16,但指针foo1和foo2不是16的倍数 因此,它会导致未定义的行为将alloc\u foo\u节点的未对齐结果转换为类型struct foo* 要解决这一问题,您必须在分配代码中多做一些工作,以确保它只为struct foo分配位于正
*foo2 = *foo1;
它起作用了
然后我尝试用gcc编译这两个案例,没有问题。对于
struct foo
,alloc\u foo\u节点返回的值可能没有正确对齐
在我的系统上,打印\u Alignof(struct foo)
会得到16
,但指针foo1
和foo2
不是16
的倍数
因此,它会导致未定义的行为将alloc\u foo\u节点的未对齐结果转换为类型struct foo*
要解决这一问题,您必须在分配代码中多做一些工作,以确保它只为struct foo
分配位于正确边界上的空间。您可以使用max\u align\u t
来帮助实现这一点(它的定义使得\u Alignof(max\u align\u t)
是所需的最大可能对齐方式)。对于结构foo
,alloc\u foo\u节点返回的值可能没有正确对齐
在我的系统上,打印\u Alignof(struct foo)
会得到16
,但指针foo1
和foo2
不是16
的倍数
因此,它会导致未定义的行为将alloc\u foo\u节点的未对齐结果转换为类型struct foo*
要解决这一问题,您必须在分配代码中多做一些工作,以确保它只为struct foo
分配位于正确边界上的空间。您可以使用max\u align\u t
来帮助实现这一点(它的定义使得\u Alignof(max\u align\u t)
是所需的最大可能对齐方式)。对于结构foo
,alloc\u foo\u节点返回的值可能没有正确对齐
在我的系统上,打印\u Alignof(struct foo)
会得到16
,但指针foo1
和foo2
不是16
的倍数
因此,它会导致未定义的行为将alloc\u foo\u节点的未对齐结果转换为类型struct foo*
要解决这一问题,您必须在分配代码中多做一些工作,以确保它只为struct foo
分配位于正确边界上的空间。您可以使用max\u align\u t
来帮助实现这一点(它的定义使得\u Alignof(max\u align\u t)
是所需的最大可能对齐方式)。对于结构foo
,alloc\u foo\u节点返回的值可能没有正确对齐
在我的系统上,打印\u Alignof(struct foo)
会得到16
,但指针foo1
和foo2
不是16
的倍数
因此,它会导致未定义的行为将alloc\u foo\u节点的未对齐结果转换为类型struct foo*
要解决这一问题,您必须在分配代码中多做一些工作,以确保它只为struct foo
分配位于正确边界上的空间。您可以使用max\u align\u t
来帮助实现这一点(它的定义使得\u Alignof(max\u align\u t)
是所需的最大可能对齐方式)。您发布的代码中没有错误。请按照发布指南中的说明发布。谢谢,我稍后会编辑代码。一个可能的问题是,alloc\u bucket
没有设置pb->next=NULL
,但您的代码似乎回复说,通过my\u malloc分配的内存被memset设置为零。这将所有字节设置为零,但是空指针并不一定表示您发布的代码中没有错误。请按照发布指南中的说明发布。谢谢,我稍后会编辑代码。一个可能的问题是,alloc\u bucket
没有设置pb->next=NULL
,但您的代码似乎回复说,通过my\u malloc分配的内存被memset设置为零。这将所有字节设置为零,但是空指针并不一定表示您发布的代码中没有错误。请按照发布指南中的说明发布。谢谢,我稍后会编辑代码。一个可能的问题是,alloc\u bucket
没有设置pb->next=NULL
,但您的代码似乎回复说,通过my\u malloc分配的内存被memset设置为零。这将所有字节设置为零,但是空指针并不一定表示您发布的代码中没有错误。请按照发布指南中的说明发布。谢谢,我稍后会编辑代码。一个可能的问题是,alloc\u bucket
没有设置pb->next=NULL
,但您的代码似乎回复说,通过my\u malloc分配的内存被memset设置为零。这将所有字节设置为零,但是空指针并不一定是反汇编显示clang在这里使用movaps
,而gcc使用movq
(amd64)。事实确实如此。正确对齐后,效果很好。@keltar谢谢。我在使用mingw/x86_64时没有遇到任何运行时错误,所以我认为OP在其他系统上,不知道clang这样做:)非常感谢,我会试试。@MattMcNabb,我在clang下试过,包括stddef.h和stdalign.h,使用选项-std=c11编译,它抱怨“使用了未声明的标识符‘max_align_t’”@noinput据我所知,它只是在clang 3.4Disassembly中添加的,显示clang在这里使用movaps
,而gcc使用movq
(amd64)。事实确实如此。正确对齐后,效果很好。@keltar谢谢。我在使用mingw/x86_64时没有遇到任何运行时错误,所以我认为OP在其他系统上,不知道clang这样做:)非常感谢,我会试试。@MattMcNabb,我在clang下试过,包括stddef.h和stdalign.h,使用选项-std=c11编译,它抱怨“使用了未声明的标识符‘max_align_t’”@没有,但据我所知,它是被添加的
*foo2 = *foo1;
memcpy(foo2, foo1, sizeof(struct Foo));