tcw_xny 发表于 2012-12-17 11:29:31

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

用VC6.0写的常用的串口打印字符串函数,定义两种格式的字符串,二者显示是不一样的
求各位大神解释下
看来我的C语言不过关啊
#include <stdio.h>
voidUART0_PutStr(unsigned char const *str);

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

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

snoopyzz 发表于 2012-12-17 11:30:54

char mystr={"fawnew"};

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

lcofjp 发表于 2012-12-17 11:37:02

确实是c基础不过关,好好学一遍吧。

cshsm 发表于 2012-12-17 11:41:44

本帖最后由 cshsm 于 2012-12-17 11:43 编辑

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

tcw_xny 发表于 2012-12-17 11:45:13

snoopyzz 发表于 2012-12-17 11:30 static/image/common/back.gif
char mystr={"fawnew"};

char mystr={"fawnew"};


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

tcw_xny 发表于 2012-12-17 11:52:51

还是我的编程习惯不好,自己个数组赋值以后要写‘/0’?

weixinal 发表于 2012-12-17 11:54:44

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

Appcat 发表于 2012-12-17 11:57:17

tcw_xny 发表于 2012-12-17 11:45 static/image/common/back.gif
意思是后面自动补’\0‘
可是我们做单片机编程的时候一般是这么做吧
char str;


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

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

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

tcw_xny 发表于 2012-12-17 12:21:41

Appcat 发表于 2012-12-17 11:57 static/image/common/back.gif
楼主的C语言还要继续提高。

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


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

cos 发表于 2012-12-17 12:47:11

受教了。

t3486784401 发表于 2012-12-17 15:11:09

VC的调试功能

本帖最后由 t3486784401 于 2012-12-17 15:12 编辑

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

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

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

tcw_xny 发表于 2012-12-18 08:10:30

t3486784401 发表于 2012-12-17 15:11 static/image/common/back.gif
“烫烫烫烫”是经典的VC调试代码。

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

原来是这个样子的
页: [1]
查看完整版本: VC6.0编程,很奇怪的问题