搜索
bottom↓
回复: 11

VC6.0编程,很奇怪的问题

[复制链接]

出0入0汤圆

发表于 2012-12-17 11:29:31 | 显示全部楼层 |阅读模式
用VC6.0写的常用的串口打印字符串函数,定义两种格式的字符串,二者显示是不一样的
求各位大神解释下
看来我的C语言不过关啊
#include <stdio.h>
void  UART0_PutStr(unsigned char const *str);

void  UART0_PutStr(unsigned char const *str)
{
        while(*str!='\0')
                putchar(*str++);          // 发送数据
}

void main(void)
{
        unsigned int xunhuan;
        char mystr[6]={"fawnew"};
        char *my_str="newfaw";
        UART0_PutStr(my_str);////////与下面显示的不一样
        UART0_PutStr(mystr);/////////与上面显示的不一样
        while(1);
}
运行结果:newfawfawnew烫烫烫?|
明显上一句显示对了,后一个错了,可是我们单片机程序一般都是按        char mystr[6]={"fawnew"};这种定义的啊
求大神解释啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-12-17 11:30:54 | 显示全部楼层
char mystr[6]={"fawnew"};

char mystr[7]={"fawnew"};
是不同的
=================
char mystr[]={"fawnew"};
等效于
char mystr[7]={"fawnew"};

出0入0汤圆

发表于 2012-12-17 11:37:02 | 显示全部楼层
确实是c基础不过关,好好学一遍吧。

出0入0汤圆

发表于 2012-12-17 11:41:44 | 显示全部楼层
本帖最后由 cshsm 于 2012-12-17 11:43 编辑

char *my_str="newfaw";
这句编译系统在编译时会自动在字符串后加上'\0',所以打印时不会出现多余的信息
char mystr[6]={"fawnew"};
这句限定了字符串长度为6,编译系统无法在字符串后加'\0',只能一直打印下去,直到遇上'\0'为止所以打印时会出现多余的信息

出0入0汤圆

 楼主| 发表于 2012-12-17 11:45:13 | 显示全部楼层
snoopyzz 发表于 2012-12-17 11:30
char mystr[6]={"fawnew"};

char mystr[7]={"fawnew"};

意思是后面自动补’\0‘
可是我们做单片机编程的时候一般是这么做吧
char str[3];
str[0]='s';
str[1]='t';
str[2]='r';
然后串口打印UART0_PUTSTR(str);
这样没问题啊,怎么解释呢?这样最后也会自动补‘\0’

出0入0汤圆

 楼主| 发表于 2012-12-17 11:52:51 | 显示全部楼层
还是我的编程习惯不好,自己个数组赋值以后要写‘/0’?

出0入0汤圆

发表于 2012-12-17 11:54:44 | 显示全部楼层
char mystr[6]={"fawnew"};c语言规定引号“”之内的字符串的末尾有个空字符作为字符串的结束标志,"fawnew"表示的数据位fawnew\0,\0是转义符号,在内存里是0。所以你这数字要用7个字节储存。而你mystr[6]是6个,这样会导致调用函数一直printf下去知道遇到内存为0的那个字节。

出1070入962汤圆

发表于 2012-12-17 11:57:17 | 显示全部楼层
tcw_xny 发表于 2012-12-17 11:45
意思是后面自动补’\0‘
可是我们做单片机编程的时候一般是这么做吧
char str[3];

楼主的C语言还要继续提高。

你的主管如果是个明白人,看到你一般这么做,会打你屁股的。

你只是运气好,或者是某个编译器自动将RAM初始化了,所以你理所当然的认为后面给你补\0了。要是运气不好,你的程序能把当前地址后面的RAM全部打印出来,你信不信。

出0入0汤圆

 楼主| 发表于 2012-12-17 12:21:41 | 显示全部楼层
Appcat 发表于 2012-12-17 11:57
楼主的C语言还要继续提高。

你的主管如果是个明白人,看到你一般这么做,会打你屁股的。

明白了,非常感谢各位啊
看来我要改下编程习惯了

出0入0汤圆

发表于 2012-12-17 12:47:11 | 显示全部楼层
受教了。

出200入2554汤圆

发表于 2012-12-17 15:11:09 | 显示全部楼层
本帖最后由 t3486784401 于 2012-12-17 15:12 编辑

“烫烫烫烫”是经典的VC调试代码。

调试模式下,VC默认把栈内存初始化为0xCC,把堆内存初始化为0xCD,方便用户查错。
在汉字GBK编码当中,烫:0xCCCC,屯:0xCDCD,
所以此时遇到“烫烫烫烫”、“屯屯屯屯”基本可以判定数组越界。

另外在发布模式下是木有这种内存初始化的,用于减轻程序负担。

出0入0汤圆

 楼主| 发表于 2012-12-18 08:10:30 | 显示全部楼层
t3486784401 发表于 2012-12-17 15:11
“烫烫烫烫”是经典的VC调试代码。

调试模式下,VC默认把栈内存初始化为0xCC,把堆内存初始化为0xCD,方便 ...

原来是这个样子的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表