标题:"0x00401128"指令引用的“0x33463288”内存。该内存不能为"read" ...
只看楼主
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
已结贴  问题点数:20 回复次数:15 
"0x00401128"指令引用的“0x33463288”内存。该内存不能为"read"
#include<stdio.h>
#include<conio.h>
int min,max;
void scan(int* arr,int n)
{
    int i;
    for(i = 0;i < n;i++)
        scanf("%d",arr+i);
}
void change(int* arr,int n)
{
    int i,temp,k;
    temp = 0;
    min = *(arr+0);
    for(i = 0;i < n;i++)
    {
        if(min > *(arr+i))
        {
                min = *(arr+i);
                k = i;
        }
        if(k != 0)
        {
            temp = *(arr+0);
            *(arr+0) = *(arr+k);
            *(arr+k) = temp;
        }   
    }
    max = *(arr+1);
    for(i = 1;i < n;i++)
    {
        if(max < *(arr+i))
        {
            max = *(arr+i);
            k = i;
        }
        if(k != 1)
        {
            temp = *(arr+9);
            *(arr+9) = *(arr+k);
            *(arr+k) = temp;
        }
    }
}
void print(int* arr,int n)
{
    int i;
    for(i = 0;i < n;i++)
        printf(" %d ",*(arr+i));
}
int main(void)
{
    int arr[10];
    printf("请输入10个数字:");
    scan(arr,10);
    change(arr,10);
    print(arr,10);
    printf("\n");
    printf("min = %d,max = %d\n",min,max);
    getch();
    return 0;
}
"0x00401128"指令引用的“0x33463288”内存。该内存不能为"read"      这是什么意思?
搜索更多相关主题的帖子: include change 
2015-11-11 20:05
我爱吃青菜
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:190
专家分:500
注 册:2015-3-29
得分:0 
...
2015-11-11 20:14
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
回复 2楼 我爱吃青菜
想说什么
2015-11-11 20:21
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
得分:0 
变量k没有初始化
2015-11-11 21:37
我爱吃青菜
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:190
专家分:500
注 册:2015-3-29
得分:0 
回复 3楼 tlliqi
以为找到问题在哪了,发了才发现不是,就改掉了
2015-11-11 22:19
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
得分:0 
就是这程序编译没问题,就是运行后要输入数字,再输完10个数字后,就出现一个小方框上面就显示"0x00401128"指令引用的“0x33463288”内存。该内存不能为"read"      这是什么意思?。。。。。就是输完数字就不处理了。就直接结束了。。。。
2015-11-12 08:58
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
得分:4 
以下是引用朔源在2015-11-12 08:58:01的发言:

就是这程序编译没问题,就是运行后要输入数字,再输完10个数字后,就出现一个小方框上面就显示"0x00401128"指令引用的“0x33463288”内存。该内存不能为"read"      这是什么意思?。。。。。就是输完数字就不处理了。就直接结束了。。。。

关于运行时内存报错的问题,是这么回事:
程序代码:
    int i,temp,k=0;
    temp = 0;
    min = *(arr+0);
    for(i = 0;i < n;i++)
    {
        if(min > *(arr+i))
        {
                min = *(arr+i);
                k = i;
        }
        if(k != 0)
        {
            temp = *(arr+0);
            *(arr+0) = *(arr+k);
            *(arr+k) = temp;
        }  
程序中从定义k到初次使用k和0比较,你没有初始化k也没有给k赋值,只是声明了了个int型的k,看运行时内存:


调试发现k在内存中的地址是0x0016f6e0,查看该地址:


发现一堆0xcc,所以处错的地方应该是在这里,你不能在这块内存被初始化前使用,如图给出的提示:


稍微改下程序,给k赋初始值,


再查看此时内存0x001d8a8


已经被赋予0了,你就可以用了。

至此,程序报内存错误的问题解决,至于其他问题,还是自己解决还是比较有成就感。



[此贴子已经被作者于2015-11-12 09:52编辑过]

2015-11-12 09:51
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
得分:0 
回复 7楼 li459461891
十分感谢!
2015-11-13 10:26
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
得分:1 
以下是引用边小白在2015-11-13 10:34:38的发言:

个人认为7楼是鼻子插大葱。常规变量无论是否初始化,都可以随便用,只是值不确定。楼主这是指针错误,自己再单步看看。


楼上说的有道理,但是有一点我不赞同,大葱那么贵我可不敢往鼻子插。

变量不初始化这程序编译没问题,就是会报运行时错误,你把你操作的步骤和输入的数据给我,
我也想弄明白你这个“该内存不能为"read"” 是哪儿引起的
2015-11-13 11:03
li459461891
Rank: 2
等 级:论坛游民
帖 子:27
专家分:89
注 册:2015-11-5
得分:4 
一种猜测:
楼主你代码的意思是想根据输入的10个数,来进行挑选最小和最大值,并且让最小值开头,最大值放最后是吧?

9L>“常规变量无论是否初始化,都可以随便用,只是值不确定。楼主这是指针错误”

我同意这种说法,以下代码中,   *(arr+0) = *(arr+k);    这句话有个问题,如果你k的值超出了范围,比如声明k之后直接使用,计算机中给分配的是0xcccccc,是1开头的二进制,这个数放在有符号的整型int中,是一个负数。以一个负数作为下标,肯定是指针错误。
        
程序代码:
if(min > *(arr+i)) 
        {
                min = *(arr+i);
                k = i;
        }
        if(k != 0)
        {
            temp = *(arr+0);
            *(arr+0) = *(arr+k);
            *(arr+k) = temp;
        }  


关于之前回答中的错误,非常抱歉,同时感谢"边小白"的指点
希望这次分析能帮到你
2015-11-13 11:22



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




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

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