标题:"0x004010e9"指令引用的"0x00000078"内存。该内存不能为"read"。 ...
只看楼主
goodmeaning
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-4-5
结帖率:0
 问题点数:0 回复次数:13 
"0x004010e9"指令引用的"0x00000078"内存。该内存不能为"read"。
"0x004010e9"指令引用的"0x00000078"内存。该内存不能为"read"。
我在编快速排序的算法,但是出现了这个状况。一下是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef int KeyType;
typedef int DataType;

struct RecordNode{
    KeyType key;
    DataType info;
};

struct SortObject{
    int n;                /* n为文件中记录个数 */
    RecordNode * record;
};

void quicksort(SortObject *p,int l,int x);            /* 快排函数 */


void quicksort(SortObject *pvector, int left, int r)
{
    int i,j;
    RecordNode temp;
    if(left>=r) return;
    i=left; j=r;
    temp = pvector->record[i];
    while(i!=j){
        while( (j>i)&&(pvector->record[j].key >= temp.key) )
            j--;
        if(j>i)
            pvector->record[i++] = pvector->record[j];
        while( (j>i)&&(pvector->record[i].key <= temp.key) )
            i++;
        if(i<j)
            pvector->record[j--] = pvector->record[i];
    }
    pvector->record[i] = temp;
    quicksort(pvector, left, i-1);
    quicksort(pvector, i+1, r);
}


void main()
{
    srand(time(0));   
    int len,k;
    printf("Please input the length of record:\n");
    scanf("%d",&len);

//为记录数组申请结点空间
    SortObject * p1 = (SortObject*)malloc(sizeof(SortObject));
    if(p1 != NULL){                            //申请成功
        p1->record = (RecordNode *)malloc(sizeof(int)*len);
        if(p1->record){
            p1->n = len;
        }
        else free(p1);
    }
    else printf("Out of space!!\n");

    int num=len;
    while(num--)
        p1->record[num].key = rand()%1000;
    printf("The new record is:\n%d",p1->record[0].key);
    for( k=1; k<len; k++)
        printf("--%d",p1->record[k].key);

    quicksort(p1,0,p1->n-1);

    printf("\n\nThe sorted record is:\n%d",p1->record[0].key);
    for( k=1; k<len; k++)
        printf("--%d",p1->record[k].key);
}
到底是哪里出错了呢?
搜索更多相关主题的帖子: 指令 read 内存 
2010-04-05 17:16
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
得分:0 
内存坏了 换个内存
2010-04-05 17:17
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
以下是引用hahayezhe在2010-4-5 17:17:08的发言:

内存坏了 换个内存
0x00000078

这个地址肯定是不能read的。系统维护的。

开机BIOS会对这地址段进行修改,中断之类的。
2010-04-05 17:35
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
-BASH-4.0.35$ gmake
g++ -g3  -c test.cpp -o test.o
g++ -g3  -o test test.o
-BASH-4.0.35$ ./test
Please input the length of record:
10
The new record is:
159--192--49--212--161--978--525--660--976--46
The sorted record is:
46--49--159--161--192--212--525--660--976--978-BASH-4.0.35$


BTW,在我这里是work的。
2010-04-05 17:36
llooppzhang
Rank: 7Rank: 7Rank: 7
来 自:江苏
等 级:黑侠
威 望:5
帖 子:308
专家分:518
注 册:2009-10-18
得分:0 
可能的话,重新装个系统
收到的鲜花
  • Devil_W2010-04-05 19:41 送鲜花  -2朵   附言:你好水。
2010-04-05 19:04
ggvvcc
Rank: 3Rank: 3
来 自:山东临沂
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2010-4-3
得分:0 
这种类型的错误经常见,有时执行应用程序时不小心访问了系统保护内存就会产生这种错误。
2010-04-05 19:12
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
得分:0 
这种情况一般都是指针的问题,可能指针的值没处理好,导致指向了不存在的内存,发生内存读错误。
碰到这种情况一般设置断点,单步调试,找出到底是哪个指针变量有问题,在追根溯源,往前看哪里对这个指针变量赋过值,是否会产生问题,仔细推敲一下,一般就能解决问题。
其实读写内存出错在使用指针时经常会碰到,关键是要细心,其次,碰到问题要有耐心,要尝试自己调试,找出问题根源。只有不断的积累经验,以后再碰到这种问题就能迎刃而解了。


你可以看一下这个表达式的值,sizeof(SortObject),我不确定是否正确,但我觉得应该是用sizeof(struct SortObject),你可以尝试一下。


[ 本帖最后由 Kid_X 于 2010-4-5 23:19 编辑 ]
2010-04-05 23:16
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
得分:0 
我这里跑也没问题。
2010-04-06 10:35
woodydongli
Rank: 2
等 级:论坛游民
帖 子:57
专家分:84
注 册:2010-4-4
得分:0 
没有问题,估计你是一边开着魔兽,一边在运行程序...
换个内存条.
2010-04-06 11:05
Kid_X
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:216
专家分:515
注 册:2007-10-8
得分:0 
LZ的程序我在VC6下无法编译,我觉得LZ应该去看一下结构体变量定义的语法。
2010-04-06 13:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-301770-1-1.html




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

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