C++ 如何复制到结构内部的数组?
如何在c中复制到结构内部的灵活数组C++ 如何复制到结构内部的数组?,c++,arrays,c,struct,sizeof,C++,Arrays,C,Struct,Sizeof,如何在c中复制到结构内部的灵活数组 #包括 #包括 类型定义结构 { int-val; char-buf[]; }傅; int main() { 福福; f、 val=4; //f.buf=“asd”->灵活数组成员的使用无效 memcpy(f.buf,“asd\0”,4); printf(“%s\n”,f.buf); } 输出: asd ***检测到堆栈崩溃***:已终止 中止(堆芯转储) 此外,如果结构声明为: typedef结构 { char-buf[]; }福 vscode编辑器提
#包括
#包括
类型定义结构
{
int-val;
char-buf[];
}傅;
int main()
{
福福;
f、 val=4;
//f.buf=“asd”->灵活数组成员的使用无效
memcpy(f.buf,“asd\0”,4);
printf(“%s\n”,f.buf);
}
输出:
asd
***检测到堆栈崩溃***:已终止
中止(堆芯转储)
此外,如果结构声明为:
typedef结构
{
char-buf[];
}福
vscode编辑器提供错误:
不允许使用不完整的类型
gcc给出了错误:
错误:结构中的灵活数组成员没有命名成员
6 | char buf[];
为什么现在允许在结构中使用数组,而指针是?(char*buf
)
另外,如果一个结构有一个灵活的数组,那么它的sizeof(struct containsFlexArray)
是多少?当它没有维度时,如何动态解析它的数组
编辑:
如果上述工作在C++中,因为不完整的数组“衰减”到已知长度的指针(x64中的8字节),为什么在
foo.val成员分配空间,而不是为bur foo.buf成员
,在这种情况下,程序尝试使用覆盖foo.val
成员(通过使用其地址而不是foo.buf
),这会导致检测到堆栈崩溃
。但为什么它以错误的方式实现?(因此我也想知道引入灵活数组的基本原理)您可能需要阅读有关灵活数组成员的信息
在结构
中使用灵活数组
时,似乎必须至少有一个其他数据成员,灵活数组成员必须是最后一个
另外,您可能会对C中灵活数组成员的用法有一些澄清,让我们在这里使用intel/amd体系结构,其中char=>1 byte int=>4,long是8字节长
结构对齐是这里的一个问题。当您在c
中声明结构时,编译器会将其视为单个块。因此,如果您有这样的结构:
struct a {
long l;
char c1;
char c2;
}
编译器查看使用的第一种类型,并为l分配8字节的内存,查看c并确定c1比l短,而不是找出c1的类型,而是为c1分配8字节的数据。它对c2也是如此。因此,您最终得到的struct长度为24字节,只使用了10字节。如果您使用这个:
struct b {
char c1;
long l;
char c2;
}
这将为c1分配1个字节,为l分配8个字节,为c2分配8个字节。因此,最终将使用17个字节和10个字节。其中,假设您有:
struct b {
char c1;
char c2;
long l;
}
它为c1分配了1个字节,为c2分配了1个字节,为l分配了8个字节。总共10个字节,但所有10个都被使用
那么它与数组有什么关系呢?您可以看看是否有:
struct aa {
char a;
long b[];
}
这将知道最初为b
分配至少一个字节。当您没有chara
时
struct aa {
long b[];
}
编译器可能不会分配任何内存(分配0字节),因为它根本不知道分配多少内存
编辑:
离开我的电脑,同时弹出另一个答案。另一个答案非常好!!!但我希望这有助于您了解发生了什么。在main()中声明实例时,您没有初始化buf[]数组。编译器不知道要分配多少内存。堆栈粉碎是一种编译器功能,它可以防止程序对计算机执行…不好的操作。请在typedef struct中的数组声明中添加一个数字。
这样地:
`#包括
#包括
也许我不明白你的问题是什么,但我对你的两个例子都没有问题。不过,我在C
中编译时再现了第二个错误,但是如果你的结构只有一个成员-不完整的数组(例如int ar[]
或char ar[]
),它在C++
中编译并成功执行你的C++会编译吗?如果是这样,那么<代码> C >代码>和<代码> C++ > /COD> BuuASE在<代码> C <代码>中,它不会编译为<代码> >灵活数组成员的错误,而没有命名成员< /COD>(可能是数组中缺少维数,但在括号中没有定义它的长度,但我怀疑C++中的数组衰减为已知长度为8字节的指针)。如果C++中的上述工作不担心,它在C或C++中不工作。当它没有分配任何内存时,试图将信息复制到<代码> f.Buf。搜索错误消息(修复拼写错误),并阅读一些你发现的东西,让它知道它的意思。@ AndrewHenle是正确的,但是它在C++中工作,因为MS VisualStudio编译器不使用标准,但它有自己的规则。
typedef struct
{
int val;
char buf[5];
} foo;
int main()
{
foo f;
f.val = 4;
// f.buf = "asd"; -> invalid use of flexible array member
memcpy(f.buf, "asd\0", 4);
printf("%s\n", f.buf);
}`