发布网友 发布时间:2022-04-24 01:27
共1个回答
热心网友 时间:2023-10-18 11:23
假定你的代码是这样的:
uchar *Buff1;
Buff1=(uchar*)malloc(10);
strcpy(Buff1,"12345678");
uchar Buff2[8]={1,2,3,4,5,6,7,8};
从数据角度讲:Buff1是个标准字符串,这里面的“1”是Ascii的字符1,其真实值49,并且拥有0作为结尾,所以Buff1的10个字节数据依次为:49,50,51,52,53,54,55,56,0,未知。Buff2是由8个字节构成的无符号字节数组,其8个字节数据依次为1,2,3,4,5,6,7,8。
从数据有效范围来讲,这里的Buff1是通过malloc从进程堆空间里分配的,要自主管理内存,当然你可以改称Buff1[10]来从栈空间分配内存,简单来说就是strcpy可以既可以操作堆中的内存也能操作栈中的内存。Buff2的定义是初始化,只能在变量定义处如此使用,你不能如此写:uchar Buff2[8];Buff2={1,2,3,4,5,6,7,8};,并且这种用法只能是在栈空间分配内存。(有关进程的内存,还是自己去察查查吧)
从错误可能性角度来看:Buff1可能出现的潜在错误是,为Buff1所分配的内存可能不足,strcpy不会去为你做任何的错误避免,只会从Buff1所指地质开始进行赋值,如果为Buff1分配的内存不足则会发生内存“溢出”,为程序埋下崩溃的隐患。Buff2可能出现的潜在错误是,编程者可能会忘记Ascii表,而把字符'5'(数字53)与数字5搞混。
如果需要Buff2成为一个标准字符串并且与Buff1同值,可以这么写
uchar Buff2[]={'1','2','3','4','5','6','7','8',0};
追问您好,感谢您的回答,我还想问一下,如果我想让buff1存入1,2,3,4,5,6,7,8,该怎么做呢?麻烦你了,,追答字符串里面用“\”转义符可以表达特殊字符,buff1可以用
strcpy(buff1, "\1\2\3\4\5\6\7\10");
注意,这里面的数字是8进制的,所以最后8用“10”表示,也可以用16进制,那么字符串就是"\1\2\3\4\5\6\7\x8"。
还有注意的是,所有C语言标准字符串在最后都隐含一个“0”表示字符串结尾,而strcpy也是根据这个来判断字符串结束的,所以如果你写
strcpy(buff1, "\1\2\3\4\0\5\6\7\10");
你就会发现只有1、2、3、4被复制给buff1了,后面的全都被舍弃了。如果不想舍弃,可以这么写:
memcpy(buff1, "\1\2\3\4\5\0\6\7\10", 10);
这个函数允许你自己写要复制多长,注意这个字符串里结尾的0所以长度是10。
来自:求助得到的回答
热心网友 时间:2023-10-18 11:23
假定你的代码是这样的:
uchar *Buff1;
Buff1=(uchar*)malloc(10);
strcpy(Buff1,"12345678");
uchar Buff2[8]={1,2,3,4,5,6,7,8};
从数据角度讲:Buff1是个标准字符串,这里面的“1”是Ascii的字符1,其真实值49,并且拥有0作为结尾,所以Buff1的10个字节数据依次为:49,50,51,52,53,54,55,56,0,未知。Buff2是由8个字节构成的无符号字节数组,其8个字节数据依次为1,2,3,4,5,6,7,8。
从数据有效范围来讲,这里的Buff1是通过malloc从进程堆空间里分配的,要自主管理内存,当然你可以改称Buff1[10]来从栈空间分配内存,简单来说就是strcpy可以既可以操作堆中的内存也能操作栈中的内存。Buff2的定义是初始化,只能在变量定义处如此使用,你不能如此写:uchar Buff2[8];Buff2={1,2,3,4,5,6,7,8};,并且这种用法只能是在栈空间分配内存。(有关进程的内存,还是自己去察查查吧)
从错误可能性角度来看:Buff1可能出现的潜在错误是,为Buff1所分配的内存可能不足,strcpy不会去为你做任何的错误避免,只会从Buff1所指地质开始进行赋值,如果为Buff1分配的内存不足则会发生内存“溢出”,为程序埋下崩溃的隐患。Buff2可能出现的潜在错误是,编程者可能会忘记Ascii表,而把字符'5'(数字53)与数字5搞混。
如果需要Buff2成为一个标准字符串并且与Buff1同值,可以这么写
uchar Buff2[]={'1','2','3','4','5','6','7','8',0};
追问您好,感谢您的回答,我还想问一下,如果我想让buff1存入1,2,3,4,5,6,7,8,该怎么做呢?麻烦你了,,追答字符串里面用“\”转义符可以表达特殊字符,buff1可以用
strcpy(buff1, "\1\2\3\4\5\6\7\10");
注意,这里面的数字是8进制的,所以最后8用“10”表示,也可以用16进制,那么字符串就是"\1\2\3\4\5\6\7\x8"。
还有注意的是,所有C语言标准字符串在最后都隐含一个“0”表示字符串结尾,而strcpy也是根据这个来判断字符串结束的,所以如果你写
strcpy(buff1, "\1\2\3\4\0\5\6\7\10");
你就会发现只有1、2、3、4被复制给buff1了,后面的全都被舍弃了。如果不想舍弃,可以这么写:
memcpy(buff1, "\1\2\3\4\5\0\6\7\10", 10);
这个函数允许你自己写要复制多长,注意这个字符串里结尾的0所以长度是10。
来自:求助得到的回答