C 指向结构的数组指针

C 指向结构的数组指针,c,arrays,pointers,structure,C,Arrays,Pointers,Structure,我写了这个程序: #include <stdio.h> #include <stdlib.h> #include <string.h> struct inventory{ int ID; char name[20]; int value; }; int main() { struct inventory *inv; inv = malloc(sizeof(1)); inv[0].ID = 10;

我写了这个程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct inventory{
    int ID;
    char name[20];
    int value;
};


int main()
{
    struct inventory *inv;

    inv = malloc(sizeof(1));

    inv[0].ID = 10;
    strcpy(inv[0].name,"hello charlie old mate");
    inv[0].value = 20;

    inv[1].ID = 20;

    printf("%d", inv[1].ID);

    return 0;
   }
#包括
#包括
#包括
结构清单{
int-ID;
字符名[20];
int值;
};
int main()
{
结构库存*库存;
inv=malloc(sizeof(1));
存货[0].ID=10;
strcpy(inv[0]。名称,“你好,查理老友”);
存货[0],价值=20;
inv[1],ID=20;
printf(“%d”,inv[1].ID);
返回0;
}

您能告诉我如何将
inv[1].ID设置为20吗。当我只为
inv
分配了1字节内存时。它如何承载多个结构的数据?

您的代码中有未定义的行为-

inv = malloc(sizeof(1));      // you allocate size of int
inv[0].ID = 10;
strcpy(inv[0].name,"hello charlie old mate");    //copying more than your buffer can hold

您分配的大小等于
int
的大小,不足以构造和访问未经授权的内存。然后在
strcpy
中,您尝试存储比可用空间更多的内容<代码>名称
可以包含
19个
字符和结尾的
'\0'
。您复制的字符串大于
19个
字符

代码中存在未定义的行为-

inv = malloc(sizeof(1));      // you allocate size of int
inv[0].ID = 10;
strcpy(inv[0].name,"hello charlie old mate");    //copying more than your buffer can hold
您分配的大小等于
int
的大小,不足以构造和访问未经授权的内存。然后在
strcpy
中,您尝试存储比可用空间更多的内容<代码>名称
可以包含
19个
字符和结尾的
'\0'
。您复制的字符串大于
19个
字符

你能告诉我如何将inv[1].ID设置为20吗。当我只为inv分配了1个字节的内存时,它如何能够承载多个结构的数据

TL;DR它不能

您看到的是对调用的内存的无效访问。在C标准中并没有任何东西可以阻止您编写访问无效内存的代码,但一旦您这样做了,瞧

分配给
inv
(通过调用
malloc(1)
)的内存远远少于它应该拥有的内存。因此,基本上,您试图访问不属于您(您的进程)的内存,因此该内存是无效的。任何访问无效内存的尝试都会导致UB

遵循相同的轨迹,即使为
inv
分配了适当的内存,也

 strcpy(inv[0].name,"hello charlie old mate");
将是UB,因为您正试图将超过20个
20
元素复制到仅大小为20的目标中(如果希望
name
用作字符串,该目标可以容纳19个有效
char
+1个空终止符)。正确计算您的内存需求并保持在一定范围内

也就是说,在使用返回的指针之前,请始终检查
malloc()
的返回值是否成功

你能告诉我如何将inv[1].ID设置为20吗。当我只为inv分配了1个字节的内存时,它如何能够承载多个结构的数据

TL;DR它不能

您看到的是对调用的内存的无效访问。在C标准中并没有任何东西可以阻止您编写访问无效内存的代码,但一旦您这样做了,瞧

分配给
inv
(通过调用
malloc(1)
)的内存远远少于它应该拥有的内存。因此,基本上,您试图访问不属于您(您的进程)的内存,因此该内存是无效的。任何访问无效内存的尝试都会导致UB

遵循相同的轨迹,即使为
inv
分配了适当的内存,也

 strcpy(inv[0].name,"hello charlie old mate");
将是UB,因为您正试图将超过20个
20
元素复制到仅大小为20的目标中(如果希望
name
用作字符串,该目标可以容纳19个有效
char
+1个空终止符)。正确计算您的内存需求并保持在一定范围内


也就是说,在使用返回指针之前,请始终检查
malloc()
的返回值是否成功。

您是否听说过未定义的行为?“当我只为inv分配了1字节内存时”为false。分配的代码sizeof(1)字节肯定不是1,但更可能是4。为了详细说明@chux sir所说的,sizeof考虑的是数据类型,而不是值,文本1的类型是int:)“我付了一个停车位的钱,但后来我在那个停车位和一些相邻的停车位上停了很多车。这怎么可能?我只付了一个停车位的钱。”@ThomasPadron McCarthy让我知道你明天早上是否能在那里找到你的车。:)你听说过未定义的行为吗?“当我只为inv分配了1字节内存时”是假的。分配的代码sizeof(1)字节肯定不是1,但更可能是4。为了详细说明@chux sir所说的,sizeof考虑的是数据类型,而不是值,文本1的类型是int:)“我付了一个停车位的钱,但后来我在那个停车位和一些相邻的停车位上停了很多车。这怎么可能?我只付了一个停车位的钱。”@ThomasPadron McCarthy让我知道你明天早上是否能在那里找到你的车。:)我知道你的意思,我叫allocate inv=malloc(sizeof(struct inventory));因此,它应该使指针只访问一个struct inv[0],尽管我在inv[1]中添加了更多内容,(…)inv[5]会编译并给出一些奇怪的答案。把我的评论翻到最上面prtscr@FenixxReborn是的,或者。为了更好地使用,
inv=malloc(sizeof*inv)
@FenixxReborn对于编辑的部件,您必须知道相应的分配和访问的大小。同样,C不会阻止您访问
inv[5]
,而您需要使用它;只为1个元素重新分配,但这将导致UB。我只为一些结构部分添加了值。它将0附加到所有这些对象。没有任何初始化。这很奇怪,我一点也不明白。我想应该有垃圾吧?UB不会通过访问此内存而导致不良结果。不过,当我在程序中创建更有效的数据时,它可能会被它所接受,对吗?那么最后什么时候