当前位置: 代码迷 >> C语言 >> 运行报错内存不可写
  详细解决方案

运行报错内存不可写

热度:7167   发布时间:2013-02-26 00:00:00.0
求助 运行报错内存不可写
#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没管到我.
  相关解决方案