首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

运行报错内存不可写

2013-02-19 
求助 运行报错内存不可写#includestdio.h#includestdlib.htypedef int ElemTypetypedef int Statust

求助 运行报错内存不可写
#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef int Status;

typedef struct QNode{
ElemType data;
QNode *next;
}QNode,*QNodeList;

typedef struct {
QNodeList front;
QNodeList rear;
}Queue,*QueueList;

Status InitQueue(QueueList Q)
{
Q->front = Q->rear = (QNodeList)malloc(sizeof(QNode));
if(! (Q->front)) return 0;
Q->front->data=111;
Q->front->next = NULL;
//free(Q->front);
}

int main()
{
    ElemType x=22;//如果把这句删除 就不报错了
QueueList Q;
InitQueue(Q);
//printf("%d",Q->front->data);
//ElemType a=22; printf("%d",a);
}

没找出来 什么错误 求各位帮帮忙
[解决办法]

引用:
引用:
QueueList Q这个指针对象没有分配内存空间

引用:
指针Q不初始化就用,当然会报错。
1楼正解

回2楼,指针指向的对象实质是内存某一点,干嘛一定要先分配?分不分配我都可以访问,只是这样的操作是正常的的还是非法的,要搞清,lz的状况叫非法内存访问.而不是没分配地址,如果那个指针的随机值恰好是一……
你也说了,是非法访问内存,那你觉得应该要做什么呢?我所说的地址是内存地址,指针的地址,你觉得是个什么样子的?是不是有一块内存访问的,还有一块是它自己本身的。
回答完了你对我的疑问!
--------------------------------------

就你说的我问几个问题吧:
问题一:如果那个指针的随机值恰好是一个合法地址,就不会出现lz的状况?
恰好?你想多了吧?如果像你说的恰好,那我们天天去大街上坐等捡钱了。声明指针,只是操作系统给该指针一个合法的指针地址,不是你数据所要存放的地址,你要搞明白!


问题二:
指针不初始化就用就可能不出错,而且还可能得到正确的值?
不初始化就使用了,可能出现未定义的结果,不要期待编译器给你擦屁股,如果你在实际的工作中这样做的话,你会被炒N+1次!

问题三:
复调用一个函数,函数返回本函数的首地址值,然后用一个指针去访问该地址.99%的情况都是ok的.?
你的函数首地址?貌似是函数的参数压栈顺序吧,你函数中的数据被放入数据段中,堆栈段,你要访问会被放入其中,要读取数据,其次出栈!


总结:该位朋友,不要声明都怀着侥幸的心理去编程,从实际出发去考虑,如果冒犯之处,多包涵!
[解决办法]
引用:
引用:引用:
QueueList Q这个指针对象没有分配内存空间

引用:
指针Q不初始化就用,当然会报错。
1楼正解

回2楼,指针指向的对象实质是内存某一点,干嘛一定要先分配?分不分配我都可以访问,只是这样的操作是正常的的还是非法的,要搞清,l……



#include<stdio.h>

char *func()
{
    printf("%x ",*(char *)func);
    return (char *)func;
}

int main()
{
    char *p = NULL;
    while(1){
        p=func();
        printf("%x \n",*p);
        sleep(1);
    }
    return 0;
}


这段程序你可以考过去试一下,我还特意延迟了1秒,p是典型的野指针,那段内存就是非法的,可以试试2次值出现不同值的概率.


#include<stdio.h>
#include<stdlib.h>

void func()
{
    char *c=(char *)malloc(5);
    *c = '1';
    *(c+1)= '2';
    *(c+2)= '3';
    *(c+3)= '4';
    *(c+4)= 0;
}

void test()
{
    char *p;
    printf("%s\n",p);
    free(p);
}

int main()
{
    func();
    test();
    return 0;
}
可以告诉你,结果99.9%都是我想要的"1234",我的p就没赋值.

这2段代码已经说明了问题,第一个通过野指针一样可能得到我想要的值,虽然这种写法是非法的,并且严格上说那段内存对我来说也是非法的,但是侥幸,os没管到我.



第2个test()中p根本没初始化,你可以试着改改func()中的赋值,看看结果.

用代码回答你的问题.只是说明一点,非法内存访问不一定会出错,但是绝对不要这么去做,因为你用到了不属于你的内存,那段内存你没有使用权,你永远不知到下一秒那段内存会被os分配给哪个程序.

热点排行