unsigned char 与 char 转换有关问题,请问

unsigned char 与 char 转换问题,请教
//其中有这么一个函数,其中参数类型要求为 unsigned char *
void fun(unsigned char *p)
{
....
}



本人c菜鸟,下面是我写的2种方式转换 char 到 unsigned char,请问这2种方式效果是不是一样的,都行?
如果代码有问题,请大家指出错误,谢谢。



//方式1
char abc[1024];
strcpy(abc,"内容.......");
fun((unsigned char *)abc); //这样直接转换行不行,会不会有问题?




//方式2
char abc[1024];
strcpy(abc,"内容.......");

int len = strlen(abc);
unsigned char ttt[len];
memcpy(ttt,abc,len);

fun(ttt);




------解决方案--------------------
用第一种方法直接转换就可以了,只是一般字节流都会要求提供长度信息的,应该这样才对:
void fun(unsigned char *p, int len)
{
....
}
然后调用的时候:
fun((unsigned char*)abc, strlen(abc));

引用:
//其中有这么一个函数,其中参数类型要求为 unsigned char *
void fun(unsigned char *p)
{
....
}



本人c菜鸟,下面是我写的2种方式转换 char 到 unsigned char,请问这2种方式效果是不是一样的,都行?
如果代码有问题,请大家指出错误,谢谢。



//方式1
char abc[1024];
strcpy(abc,"内容.......");
fun((unsigned char *)abc); //这样直接转换行不行,会不会有问题?




//方式2
char abc[1024];
strcpy(abc,"内容.......");

int len = strlen(abc);
unsigned char ttt[len];
memcpy(ttt,abc,len);

fun(ttt);

------解决方案--------------------
用方式一直接转就可以了。
------解决方案--------------------
无符号和有符号的数值范围是不同的,强转的话数值可能会改变
------解决方案--------------------
所有的类型转换都不需要拷贝数据。
------解决方案--------------------

char abc[1024="内容......."; 
fun((unsigned char )*p);
就可以了;
除非 你的unsigned char  和  char 含义不同。
------解决方案--------------------
char 和unsigned char 的区别就是前者每个char只能用后7个bit,第一个当成符号。
把char里的值拷贝到unsigned char,应该没什么危险,反过来的话,可能会改变第一个bit的含义,导致错误。
第二个方法的第5行应该不行吧,编译没有报错吗?
需要注意的是,你传递的内容包含中文的话,字符串的长度要小心,unicode编码是每个中文2个字符。
------解决方案--------------------
二进制的表示模式相同

如果是“函数参数类型要求为 unsigned char * ” 一般编译器会帮你隐式转换