Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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
C 结构赋值:段错误11_C_Struct_Clang - Fatal编程技术网

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));