读书人

【Access violation】【数据结构】【C

发布时间: 2013-01-23 10:44:49 作者: rapoo

【Access violation】【数据结构】【C语言】问题求助!!!!
本帖最后由 Mulany_guo 于 2013-01-05 11:08:09 编辑 请高人指点,下面是创建单链表的一段程序,我在输入:11 回车 12 回车 后则出现错误提示Unhandled exception at 0x00411450 in Create_Print_Free.exe: 0xC0000005: Access violation writing location 0xcdcdcdd1.不知为何?


#include <stdlib.h>
#include <stdio.h>
#define MAX 10

struct list
{
int Num;
int Data;
struct list *Next;
};
typedef struct list Node;
typedef Node *Link;

void Create_List(Link Head,int n);

void main ()
{
Link Head;
Head=(Link)malloc(MAX*sizeof Node);

Create_List(Head,MAX);
}

void Create_List(Link Head,int n)
{
//int Data1;
printf("Please input Datas:\n");
for (int i=0;i<n;i++)
{
scanf("%d",&(Head->Data));
//Head->Data=Data1;
Head->Num=i;
Head=Head->Next;
//fflush(stdin);
}
}
数据结构 C语言 单链表创建 malloc内存分配 Access?violation
[解决办法]
引用:
引用:引用:引用:Head->Next没有赋值 就作为右值使用了的问题
Head=(Link)malloc(MAX*sizeof Node);只是分配了一部分空间,就可以直接引用结构体的成员Head->Next吗?分配的空间怎么会确定有架构体……


malloc一块内存,只要这块内存足够你要表示的数据或对象的大小,你可以用这块内存表示任意一种类型的数据或对象

举个例子
你可以int *p = (int *)malloc(4);
你同样可以DWORD *p = (DWORD *)malloc(4);
malloc的时候 系统并不管你这块内存被谁用

至于编译器怎么知道Next成员的,是通过 .运算符 和 ->运算符计算出来的
struct list
{
int Num;
int Data;
struct list *Next;
};
编译器在编译这个结构体的时候就已经知道list总共是12字节,第一个4字节是Num,第二个4字节是Data,第三个4字节是Next;只要你将一块 >=12字节 的内存块传给struct list *p,那么p->Num:编译器就自己对应前4字节,p->Data对应第2个4字节,p->Next对应第3个4字节,如果内存块大于12字节,后面多余的内存不对应任何值

读书人网 >C语言

热点推荐