免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3017 | 回复: 9
打印 上一主题 下一主题

为什么我的程序运行时Windows报错? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-04 17:17 |只看该作者 |倒序浏览
我的代码如下,这段代码是自己对照《数据结构与算法C语言版》中的算法自己用C实现的联系程序。下面的代码是实现顺序表的片断:
问题在main中
main 函数如下:
void main(){
        int i,t ;
        SqList L;
        if(!InitList(L))exit(ERROR);
        printf("请输入数字,默认为5个\n");
        for(i =1;i <= 5; i++){
                int z[5] ;
                scanf("%d",z[i-1]);
                if (!ListInsert(L,i,z[i-1]))exit(ERROR);
        }


}

其中用到的2个函数 InitList,和  ListInsert 代码如下:

InitList:

//构造一个空表

typedef int Status;

Status InitList(SqList &L) {
        L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
        if(!L.elem)exit(OVERFLOW);
        L.length = 0;
        L.listsize = LIST_INIT_SIZE;
        return OK;

}

ListInsert:

typedef int ElemType;

//在指定位置插入元素
Status ListInsert(SqList &L,int i,ElemType e){
        ElemType *p,*q,*newbase;

        if(i <1 || i > L.length +1)return(ERROR);
        if(L.length >= L.listsize){
                newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
                if(!newbase)exit(OVERFLOW);
                L.elem = newbase;
                L.listsize += LISTINCREMENT;       
        }
        q = &(L.elem[i -1]);
        for(p = &(L.elem[L.length -1]);p >= q; --p) *(p+1) = *p;
        *q = e ;
        ++L.length;
        return OK;       
}

现在的问题是在main中的for

for(i =0;i < 5; i++){
                int z[5] ;
                scanf("%d",z[i]);
                if (!ListInsert(L,i,z[i]))exit(ERROR);
        }

运行时报

0X 某某内存引用了“0XCCCCCCCC”内存,该内存不能为“written"

这是什么问题啊?

[[i] 本帖最后由 Northwindrocker 于 2007-1-4 19:52 编辑 [/i]]

论坛徽章:
0
2 [报告]
发表于 2007-01-04 17:25 |只看该作者
没看你的代码,从报错的情况来看,应该是你没有对指针进行初始化

xp默认将指针初始化为0xcccccccc,是指向一个内核区域的,自然会出错

论坛徽章:
0
3 [报告]
发表于 2007-01-04 18:07 |只看该作者
err

很簡單 vc在debug下會把沒有輔值的内存設置為0xcccccccc 所以 用了野指針或者是緩衝區溢出了

论坛徽章:
0
4 [报告]
发表于 2007-01-04 19:16 |只看该作者
照楼上2位的说法是我的指针没有初始化啦。
那么有问题的估计是这段咯

void main(){
        int i,t ;
        SqList L;
        if(!InitList(L)){
                printf("E001\n");
                exit(ERROR);
        }
.... ......
而InitList()函数就是初始化的阿,难道是这个函数错了吗?

//构造一个空表

Status InitList(SqList &L) {
        L.elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));
        if(!L.elem)exit(OVERFLOW);
        L.length = 0;
        L.listsize = LIST_INIT_SIZE;
        return OK;

}

而SqList 的结构是这样申明的

struct SqList{
        ElemType   *elem;
        int        length;
        int        listsize;
};

这么写错误在哪里呢?

[ 本帖最后由 Northwindrocker 于 2007-1-4 19:18 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-01-04 19:38 |只看该作者

我写一个非常简单的字符数组处理的程序也从这是为什么

/***********************
测试用数组来实现字符使用
2007-01-04
Vincent
************************/
#include  <stdlib.h>
#include  <stdio.h>

void main(){
        char  s[80];
        int i = 0 ;
        gets(s);
        for(i =0;i<80;i++){
        printf("%s\n",s[i]);
        }
}

这个同样也报
0x00000061错误?

这也是数组没有初始化吗,应该如何改正这个错误?

论坛徽章:
0
6 [报告]
发表于 2007-01-04 19:43 |只看该作者
1 把“scanf("d%",z[i]);”改成“scanf("d%",&z[i]);"试试
2 另外,5楼的printf参数中将z[i]当char*使用了,指针错。

论坛徽章:
0
7 [报告]
发表于 2007-01-04 20:00 |只看该作者
原帖由 Northwindrocker 于 2007-1-4 19:38 发表
/***********************
测试用数组来实现字符使用
2007-01-04
Vincent
************************/
#include  <stdlib.h>
#include  <stdio.h>

void main(){
        char  s[80];
        int i = 0  ...



同意6楼

改成:

  1. .........
  2. printf("%c", s[i]);
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-01-04 21:03 |只看该作者
5 楼按照你的方法我该了程序

for(i =1;i <= 5; i++){
                int z[5] ;
                scanf("%d",&z[i-1]);
                if (!ListInsert(L,i,z[i-1])){
                        printf("E002\n");
                        exit(ERROR);
                }
        }

证明你说的正确的,没有再报内存错,但是我在加了一段测试内容的代码后发现一个新问题,估计是没初始化的问题。

加的代码是把list中的内容输出:

for(i = 1 ; i <= L.length;i++){
               
                printf("%d",GetElem(L,i,e));
        }
输出是输出了,但是我输入
1
2
3
4
5
结果出来是
1
5
-842150451
-842150451
-842150451
这个结果就很奇怪了,只有第一个是正确的。

论坛徽章:
0
9 [报告]
发表于 2007-01-05 10:00 |只看该作者
for(i =0;i < 5; i++){
                int z[5] ;
                scanf("%d",z[i]);
                if (!ListInsert(L,i,z[i]))exit(ERROR);
        }
-----------------------------------
这scanf能对?!!!  &z[i]嘛!

另外你的测试代码
for(i =0;i<80;i++){
        printf("%s\n",s[i]);
        }
什么意思啊?!!!!for循环了还为什么prinf("%s"...) 啊, 既然for循环就printf("%c"....)得了

论坛徽章:
0
10 [报告]
发表于 2007-01-05 13:56 |只看该作者
我已经改过了,但是目前的错误见7楼,为什么有这样的错误?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP