为什么Malloc分配的内存比我请求的多?

为什么Malloc分配的内存比我请求的多?,c,arrays,pointers,struct,malloc,C,Arrays,Pointers,Struct,Malloc,我必须定义struct的动态数组。但当我这样定义数组时: #include <stdio.h> #include <stdlib.h> struct user { int id; char *name; int *friendlist; int *blocklist; char *university; int age; }; int main (void) { struct user *Userlist; User

我必须定义struct的动态数组。但当我这样定义数组时:

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

struct user {
   int id;
   char *name;
   int *friendlist;
   int *blocklist;
   char *university;
   int age;
};

int main (void)
{
    struct user *Userlist;
    Userlist = malloc(sizeof(Userlist) * 10);
    Userlist[2815].name="Someone";
    printf("%s\n", Userlist[2815].name );
    return 0;
}
#包括
#包括
结构用户{
int-id;
字符*名称;
国际*友人名单;
int*区块列表;
查尔*大学;
智力年龄;
};
内部主(空)
{
结构用户*用户列表;
Userlist=malloc(sizeof(Userlist)*10);
Userlist[2815].name=“Someone”;
printf(“%s\n”,用户列表[2815]。名称);
返回0;
}

我为10个用户列表结构定义了内存。它存储2815结构。但当我尝试为2816结构赋值时,它会显示“segmentation error.Core dumped”。它必须存储我分配的10个结构,但为什么要存储2815个结构?

它不存储malloc 2815结构。事实上,它只有10个指针!!(在一个典型的系统上大约80个字节)你不会因为偶然的机会而得到错误,不是因为编译器的特性。希望这能有所帮助。

malloc调用只留出您指定的存储空间(struct user的10个元素)。C对数组访问不做任何边界检查;该语言假设您知道数组有多大,并且您足够聪明,不会超过数组的末尾

试图访问超过数组末尾的项会调用未定义的行为,这不一定会导致segfault或崩溃。碰巧索引2815处的内存没有受到保护,或者没有被用于任何“重要”的事情(尽管它可能影响了其他地方的执行)

以下是“未定义行为”的定义,以供参考:

3.4.3

1未定义的行为
使用不可移植或错误的程序结构或错误的数据时的行为, 本国际标准对其无任何要求

2注:可能的未定义行为范围包括完全忽略情况和不可预测 结果,在翻译或程序执行过程中,以文件化的方式表现为 环境(无论是否发出诊断消息),以终止翻译或 执行(发出诊断消息)

3示例未定义行为的一个示例是整数过流的行为

定义一个包含2个int值、2个int指针和2个char指针的结构

Userlist = malloc(sizeof(Userlist) * 10);// mind that malloc returns a void* so you should probably add a typecast 
为UserList类型的10个元素的数组分配内存;Userlist是user*类型,因此基本上您是为sizeof(指针)分配内存,在大多数系统上,它是sizeof(int)-4字节。 您可能希望为用户类型的10个元素的数组分配内存:

Userlist = (user*)malloc(sizeof(user) * 10);
可以说,你还没有走出困境;任何分配,如:
Userlist[0].name=“Someone”
仍然是未定义的行为,因为您为指针分配内存,但不为指针指向的缓冲区分配内存。对于这个特殊的赋值,编译器为字符串分配内存,它只在堆栈上分配内存,而不是在堆上分配内存——所以要小心


希望这有帮助

但“但它存储2815结构”的说法是妄想。您的代码具有未定义的行为,因此无法从其行为中得出任何结论。
Userlist=malloc(sizeof(Userlist)*10)
你可能是指
Userlist=malloc(sizeof(*Userlist)*10)(1)用户列表是指针。(2) 您有10个指向struct user的指针。(我将
return 0
main
函数移到了它里面,因为这个错误与您的问题无关。但是,您应该注意发布您的确切代码——这不可能,因为它不会编译。)所以我必须继续吗?我只有10个struct@约翰Bode@GismatKazimli:不是“喜欢”。出于所有目的,您只为10个结构成员分配了内存,因此您只能访问10个元素,而不会遇到所遇到的问题。你的程序并没有“模拟”内存访问限制在10个元素以内,它真的做到了。@Jongware-okey,谢谢大家
Userlist = (user*)malloc(sizeof(user) * 10);