[英]array pointers to structures
我写了这个程序:
#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;
}
您能告诉我如何将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
尝试存储比可用空间更多的内容。 name
可以包含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个大小的目标中(如果您希望将name
用作字符串 ,则可以容纳19个有效chars
+ 1个空终止符 )。 正确计算您的内存需求,并保持在界限之内。
也就是说,在使用返回的指针之前,请务必检查malloc()
的返回值是否成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.