我正在尝试学习动态内存分配和结构,我有一些问题。
首先
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int *number;
number = malloc(1*sizeof(int));
int a;
for(a=0;a<150;a++)
{
number[a]=a;
printf("%d ",number[a]);
}
return 0;
}
在这个示例中,我计划它给我带来错误。因为我把它的大小分配为1个整数,所以我写的整数太多了。这不是应该给我一个错误吗?你能详细解释一下吗?
struct people
{
char *name;
int age;
char *personalInfo;
} human[3];
当我定义这样的结构时,我如何分配它来保持3个人以上?我怎么能把它变成类似人类的东西呢?如果答案是写*human而不是human[3],我应该如何分配它?像malloc(number*sizeof(char)*sizeof(int)*sizeof(char))
?
还有一件事,在第二个例子中,我需要分配名称和personalInfo指针吗?
在这个示例中,我计划它会给我带来错误。
您不能"计划出错"。你说代码是错误的是正确的,因为你写的代码超过了数组的末尾,但C没有边界检查——访问数组只是未定义的行为,这意味着它可以做任何事情——它可以假装工作正常,也可以崩溃,或者它可以让恶魔从你的鼻子里飞出来。
如何将其更改为类似人类[20]或更多的内容?
嗯。。。这就是为什么:
struct people {
// members here
} human[20];
我不明白为什么数字"3"这么特别。如果你想动态分配内存,你可以按照其他数据类型的方式来分配:使用sizeof
操作符:
struct people *human = malloc(sizeof(human[0]) * number_of_people);
或
struct people *human = malloc(sizeof(struct people) * number_of_people);
C不提供数组的编译时或运行时边界检查。程序必须执行自己的绑定检查。如果在数组末尾以外进行写入,则程序将具有未定义的行为。在实践中,这意味着您通过写入未初始化的区域或分配器用于记账的区域来破坏进程的内存。这可能会导致程序立即崩溃,在退出时崩溃,或者覆盖堆中其他(可能不相关)变量的值。
要分配可变数量的people
结构,可以执行以下操作:
struct people *humans;
humans = malloc(N * sizeof(struct people));
// humans now points to an array of N `people`
对于最后一个问题,是的,您必须为这些字符串分配空间,除非您只是简单地使用这些指针来指向在其他地方定义/分配的字符串。注意,这意味着即使在上面分配N个对象的代码中,我仍然没有为字符串分配任何空间,并且在这样做之前无法写入它们
struct people
{
char *name;
int age;
char *personalInfo;
};
struct people *human;
human = malloc(sizeof(*human) * 20);
在这个示例中,我计划它会给我带来错误。因为我把它的大小分配为1个整数,所以我写的整数太多了。这不是应该给我一个错误吗?你能详细解释一下吗?
不,不应该。这是未定义的行为,可能会导致运行时崩溃,但编译器既不会对此发出警告,也不会产生任何错误。您可以通过在内存探查器(如valgrind)中运行程序来检测这样的错误。
当我定义这样的结构时,我如何分配它来保持3个人以上?我怎么能把它变成类似人类的东西呢?
像这样:
struct people *human = malloc(20 * sizeof(struct people));
像
malloc( number*sizeof(char)*sizeof(int)*sizeof(char) )
吗?
除了太不方便之外,将单个字段的大小相加可能不会产生正确的大小,因为编译器可以填充struct
以优化对其字段的访问。这就是为什么您需要使用sizeof(struct people)
。
第一个示例调用未定义的行为。
§6.5.6/8: If both the pointer operand and the result point to elements of the same array
object, or one past the last element of the array object, the evaluation shall not
produce an overflow; otherwise, the behavior is undefined
如果你想分配20个人,你可以做…
typedef struct people
{
char *name;
int age;
char *personalInfo;
}People;
人*人;
human = malloc(sizeof(*human) * 20);