Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ 如何复制到结构内部的数组?_C++_Arrays_C_Struct_Sizeof - Fatal编程技术网

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编辑器提

如何在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编辑器提供错误:

不允许使用不完整的类型
gcc给出了错误:

错误:结构中的灵活数组成员没有命名成员
6 | char buf[];
为什么现在允许在结构中使用数组,而指针是?(
char*buf

另外,如果一个结构有一个灵活的数组,那么它的
sizeof(struct containsFlexArray)
是多少?当它没有维度时,如何动态解析它的数组

编辑:
如果上述工作在C++中,因为不完整的数组“衰减”到已知长度的指针(x64中的8字节),为什么在 C<代码>代码中也不存在这种情况?如果我查看asm,我会发现程序没有为结构分配足够的堆栈(它只为
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
分配至少一个字节。当您没有char
a

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