| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3538 人关注过本帖
标题:请教:调用malloc时出现Access violation writing location的错误怎么办?? ...
只看楼主 加入收藏
gklifg
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-3-27
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:5 
请教:调用malloc时出现Access violation writing location的错误怎么办??
#include"stdio.h"
#include"malloc.h"
#define ERROR 0
#define OK 0
#define    STACKINCREMENT 5
typedef int status;

typedef struct List
{
    char *base;
    int length;
    int listsize;
}List;

typedef struct BiTree
{
    BiTree *lchild;
    BiTree *rchild;
    char data;
}BiTree, *BiTreeP;

typedef struct stack
{
    BiTreeP *base;
    BiTreeP *top;
    int stacksize;
}stack;

status InitList(List *l)
{
    if(!(l = (List*)malloc(sizeof(List)))) return ERROR;
    l->base = NULL;
    l->length = 0;
    l->listsize = 0;
}

status scandata(List *l,int n)
{
    if(!(l->base = (char*)malloc(n*sizeof(char)))) return ERROR;//程序卡在这一行,给出的错误对话框是:"
    char *p = l->base;                                          //Unhandled exception at 0x00f61497 in BiTree.exe: 0xC0000005:
    while(p)                                                    //Access violation writing location 0x00000000."
    {
        scanf("%d",p);
        p++;
    }
}

status InitStack(stack *s,int n)
{
    s->stacksize = n;
    if(!(s->base = (BiTreeP*)malloc(sizeof(BiTreeP)))) return ERROR;
    s->top = s->base;
}

int push(stack *s,BiTree *ch)
{
    if(!(s->base + s->stacksize <= s->top))
    {
        BiTreeP *newbase;
        if(!(newbase = (BiTreeP*)realloc(s,(s->stacksize + STACKINCREMENT)*sizeof(BiTreeP))))
            return ERROR;
        else
        {
            s->stacksize += STACKINCREMENT;
            s->base = newbase;
            s->top = s->base + s->stacksize;
        }
    }
    *(s->top++) = ch;
    return OK;
}

int StackEmpty(stack *s)
{
    if(s->top = s->base) return 1;
    else return 0;
}

status main()
{
    BiTree *ps = NULL;
    stack *s = NULL;
    List *l = NULL;
    char * pl = NULL;
    int n;
    InitList(l);
    printf("How many data will be inputed ?\n");
    scanf("%d",&n);
    scandata(l,n);
    InitStack(s,n);
    if(!(ps = (BiTree*)malloc(sizeof(BiTree)))) return ERROR;
    push(s,ps);
    while(!StackEmpty(s))
    {
        while(*pl != '#')
        {
            if(!(ps->lchild = (BiTree*)malloc(sizeof(BiTree)))) return ERROR;
            ps->data = *pl;
            push(s,ps);
            ps =ps->lchild;
            pl++;
        }
        ps = ps->rchild;
        pl++;
    }
    return OK;
}
搜索更多相关主题的帖子: return 
2011-04-14 16:04
gklifg
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-3-27
收藏
得分:0 
忘了说:这个程序是作用是实现二叉树的顺序建立
比如:
输入:
5//输入数据的总数
A
B
#
#
#
就可以按先序建立一个二叉树。
下面的主函数应该还会有很多错误,大家不用在这里纠缠过久,我纳闷的就是那个报错,辛苦大家啦!
2011-04-14 16:11
w123012306
Rank: 9Rank: 9Rank: 9
来 自:湖南
等 级:蜘蛛侠
威 望:4
帖 子:307
专家分:1180
注 册:2010-4-22
收藏
得分:2 
c语言有点头痛!!

楼上,楼下的一定要幸福开心哦!
2011-04-14 16:21
zgy455793893
Rank: 2
等 级:论坛游民
帖 子:5
专家分:32
注 册:2007-5-25
收藏
得分:2 
我上学的时候没有学好 哎 只有看看了

www.138ys.cc  www.yo5.cc
2011-04-15 21:32
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
收藏
得分:11 
status InitList(List *l)
{
    if(!(l = (List*)malloc(sizeof(List)))) return ERROR;
    l->base = NULL;
    l->length = 0;
    l->listsize = 0;
}
这样写有问题。
函数传的是形参,会对参数copy一份,所以你在InitList中对l赋值,对于函数外部是不可见的,即main函数中l的值是不会由于你调用InitList()而改变的。
所以main函数中的l变量的值仍旧是null,所以传到scandata()函数中仍旧是null,
于是if(!(l->base = (char*)malloc(n*sizeof(char)))) return ERROR;这一行中l的值是null,给l->base赋值就出错了。

能力有限,讲的不是很清楚,LZ不理解我也无能为力了。
2011-04-15 21:48
gklifg
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-3-27
收藏
得分:0 
五楼很到位,就是这的问题!我指针用得晕了。谢谢!
2011-04-15 22:44
快速回复:请教:调用malloc时出现Access violation writing location的错误怎么 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013478 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved