#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);
}
没找出来 什么错误 求各位帮帮忙
------解决方案--------------------------------------------------------
你也说了,是非法访问内存,那你觉得应该要做什么呢?我所说的地址是内存地址,指针的地址,你觉得是个什么样子的?是不是有一块内存访问的,还有一块是它自己本身的。
回答完了你对我的疑问!
--------------------------------------
就你说的我问几个问题吧:
问题一:如果那个指针的随机值恰好是一个合法地址,就不会出现lz的状况?
恰好?你想多了吧?如果像你说的恰好,那我们天天去大街上坐等捡钱了。声明指针,只是操作系统给该指针一个合法的指针地址,不是你数据所要存放的地址,你要搞明白!
问题二:
指针不初始化就用就可能不出错,而且还可能得到正确的值?
不初始化就使用了,可能出现未定义的结果,不要期待编译器给你擦屁股,如果你在实际的工作中这样做的话,你会被炒N+1次!
问题三:
复调用一个函数,函数返回本函数的首地址值,然后用一个指针去访问该地址.99%的情况都是ok的.?
你的函数首地址?貌似是函数的参数压栈顺序吧,你函数中的数据被放入数据段中,堆栈段,你要访问会被放入其中,要读取数据,其次出栈!
总结:该位朋友,不要声明都怀着侥幸的心理去编程,从实际出发去考虑,如果冒犯之处,多包涵!
------解决方案--------------------------------------------------------
#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次值出现不同值的概率.
可以告诉你,结果99.9%都是我想要的"1234",我的p就没赋值.
#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;
}
这2段代码已经说明了问题,第一个通过野指针一样可能得到我想要的值,虽然这种写法是非法的,并且严格上说那段内存对我来说也是非法的,但是侥幸,os没管到我.