当前位置: 代码迷 >> 单片机 >> C51指针有关问题请问
  详细解决方案

C51指针有关问题请问

热度:86   发布时间:2016-04-28 16:13:20.0
C51指针问题请教
我在学习指针过程碰到一个问题,请教大家:
  下面程序,单片机上电运行,第一次调用readRom()函数正常,第二次调用读取的数就不对了,也就是说while(1) 里第二个循环就不对了,第一个循环是正确的,第三次以后每次读出数字跟第二次是一样的,如果把指针*p换为全局的,也就是程序最前面定义,就正确了,把*p换成普通变量,也没问题的,请问这是为什么?
.....
.....
[code=C#][/code]
readRom()
{
unsigned char *p,i;
  for(i=0;i<8;i++)  
  {
  *p=readbyte(); //读取一个字节
  lcd_dis(*p); //显示到LCD
 
  }
}

main()
{
while(1)
{
readRom();
delayms(200); //延时一会
}}




------解决方案--------------------
unsigned char *p,i;
for(i=0;i<8;i++)
{
*p=readbyte(); //读取一个字节

P没有指定空间。。。

程序乱写到别的地方了


------解决方案--------------------
unsigned char *p,i; //这里,定义了指针,但没有赋值
for(i=0;i<8;i++)
{
*p=readbyte(); //读取一个字节 //这里,使用了指针,但依然没有赋值,仅仅是对指针指向的内存进行了数据操作 
lcd_dis(*p); //显示到LCD //这里,仍然没有涉及到指针本身的值,仅仅是读取了指针指向的内存的值

这里完全是把指针当一般的Uchar来用了,理论上来说这也没什么,只是多了一个值的传递罢了。唯一的风险就是在其他的程序运行中,恰好影响到了我们未知的P的本身的值或其所指向的内存,从而造成其他影响。但是如果在其他的函数中没有点名提到P或固定位置的RAM的话,编译器是不会让上面的事情发生的。所以我们才会说把其他的函数也贴来看看。

PS:C51的RAM很小的,而且在编译时还会涉及的诸多设置的问题,所以不能提供完整的信息的话,想找问题是很难的

------解决方案--------------------
全局指针变量的话,其本身值是固定的,是不会被其他用途占用的,但仍然有其指向的内存被篡改的可能
------解决方案--------------------
还真是你指针没有分配空间的问题

把指针换成数组就好了

p[1];
------解决方案--------------------
C/C++ code
readRom(){unsigned char *p,i;  for(i=0;i<8;i++)     {  *p=readbyte(); //读取一个字节  lcd_dis(*p); //显示到LCD    }}
------解决方案--------------------
探讨
还有问一下,在C51中如何初始化针,或分配空间?

------解决方案--------------------
初始化他,就上你楼上的兄弟,unsigned char* p = &a; 这个就是合法地址了。a作为全局变量,编译器会自动给他一个合法的地址,而且长期占用。而这个地址给了指针,这个指针就算分配了合法地址,当然还有其他赋值方法。
------解决方案--------------------
条件满足的话,可以用malloc
------解决方案--------------------
unsigned char *p,i;

指针没有赋予初值就到处指有问题
  相关解决方案