yang4055 发布留言 2008-10-7 10:44
定义的字符串变量莫名奇妙的地改变了!【已解决,指针越界】
最近编程时遇到一个问题,我在文件中定义了好多[/bo]类似以下的字符串变量:
char STBLine1Array[]={0xAA,0x6E,0x0A,0x00,0x1A,0x00,0xC4,0xEA,0xA3,0xBA};
但在使用时这些字符串会自己改变[/bo],长度没变,但内容变了。这种情况经常会出现。别人说是可能是存放该变量的内存被改变了。请问高手这具体是什么原因,怎么解决?谢谢了![em08]
[ 本帖最后由 yang4055 于 2008-10-15 14:34 编辑 [/it]]
forever74 发布留言 2008-10-7 10:48
指针或者下标越界造成的,仔细检查源代码
另外,叫做字符串的东西内部是不能带有0x00的
qfyzy 发布留言 2008-10-7 10:50
代码发上来,不然没法帮你解决。OX00后面的东西一般会被无视~
yang4055 发布留言 2008-10-7 11:04
是这样的:
char STBLine1Array[]={0xAA,0x6E,0x0A,0x00,0x1A,0x00,0xC4,0xEA,0xA3,0xBA};
这是要通过串口发到LCD的一个字符串,可以显示 “-> 年:”,然后调用函数
SIO_SendBytes(com, size, sendarray)来发送该串:
SIO_SendBytes(COM1, 10, STBLine1Array);//COM1是端口,10是长度,STBLine1Array是名字。
这个函数是硬件商提供的,已经做成库,没有细节。
在使用时经常会出现发送的数据不是自己想要的数据,通过printf输出,可以看到内容已经改变。
forever74 发布留言 2008-10-7 11:49
那你就应该去看说明书或者咨询硬件厂商
我怀疑那个函数会把你给出的数组空间直接作为通信缓冲区
那就这样:
char ch[MAX_LENGTH]; //拿它作缓冲区
strcpy(ch,STBLine1Array);
SIO_SendBytes(COM1,10,ch); //要破坏就破坏ch,破坏不到你的那个数组了
yang4055 发布留言 2008-10-7 12:39
我试试,看看能不能解决问题!谢谢各位![em01]
StarWing83 发布留言 2008-10-7 13:40
1 SIO_SendBytes的地三个参数是const char*还是单纯的char*呢?
2 你在SIO_SendBytes和初始化之间,有没有做任何操作?试验一下
char msg[10]={...};
//马上send
SIO_SendBytes(COM1,10,msg);
这样会不会出错。
3 如果在这种情况下,还出错,就使用5楼的做法吧。不过提醒你请使用memcpy,而不是strcpy。
4 如果2没有出错。检查这两个语句之间的所有语句,特别是指针和数组下标索引,极有可能是你溢出了。
5 终极方案:这样做,字符串一定不会改变的,定义成:const char msg[]={...};需要修改的时候,用memcpy复制到缓冲区修改。
菜菜小 发布留言 2008-10-7 14:41
*** 作者被禁止或删除 内容自动屏蔽 ***
永夜的极光 发布留言 2008-10-7 16:20
一般能作为产品的库是不会有这种低级错误的,所以你还是要检查你自己的代码,肯定是你哪个位置指针操作越界了
forever74 发布留言 2008-10-7 18:40
大意了,大意了,呵呵
yang4055 发布留言 2008-10-15 11:27
谢谢各位大虾,我的问题解决了,果然是指针越界的问题。问题是这样的:
#define RECODER 20;
char ElecAll[RECODER][100];
char (*PBASE)[100] = ElecAll;
char (*PTOP)[100] = ElecAll+RECODER;
char (*PMOVE)[100] = ElecAll;
在存储数据时的最高上限因该是PTOP-1,而不是PTOP,结果我搞越界了,把内存搞乱了。
页: [1]