向char传递字符串时出现警告359*

向char传递字符串时出现警告359*,c,mplab,C,Mplab,我正在尝试将字符串传递给函数: void PassString(unsigned char * value) { // ... } int main(void) { while(1) { PassString("TEST"); } } 我收到警告:359指针类型之间的非法转换。正在传递的字符串文本的类型为char[],但参数的形式为unsigned char* 因此,将参数的类型更改为char[]。正在传递的字符串文本的类型为char[],但参

我正在尝试将字符串传递给函数:

void PassString(unsigned char * value)
{
    // ...
}

int main(void)
{
    while(1)
    {
        PassString("TEST");
    }
}

我收到警告:359指针类型之间的非法转换。

正在传递的字符串文本的类型为char[],但参数的形式为unsigned char*


因此,将参数的类型更改为char[]。

正在传递的字符串文本的类型为char[],但参数的形式为无符号char*

因此,将参数类型更改为char[]。

简短回答:

诸如TEST之类的字符串文本在C中属于char[]类型

因此,将函数更改为接受char*。或者将参数强制转换为unsigned char*,即使这是一个不太干净的解决方案

char背后的一些历史:

当涉及到字符类型时,C类型系统有点功能失调。在恐龙在地球上行走的早期,并没有规定每个默认字符是有符号的还是无符号的

有符号是有意义的,因为这使char与较大的整数类型一致。unsigned也有意义,因为不存在具有负索引的字符符号表

在语言标准化之后,已经有各种编译器赋予字符不同的符号。因此决定char的符号性应该由实现定义。即:每个编译器决定

出于同样的原因,char、signed char和unsigned char类型被声明为3种不同的类型。这意味着您不能在指向这些类型的指针之间进行隐式转换。相反,您需要通过强制转换使用显式转换

只有角色类型表现得如此怪异。以int和signed int为例,它们总是兼容的,int总是有符号的

这是C语言的一个已知缺点。因此,stdint.h库中的类型优先于原始字符类型

使用字符类型的最佳实践:

如果要处理多达8位的文本字符串,请使用char类型,并且仅在该类型。 如果处理原始二进制数据或执行类型punning等操作,请使用unsigned char或uint8\t类型。 如果正在执行有符号8位整数算术,请使用有符号字符或整数。 如果正在执行无符号8位整数算术,请使用无符号字符或uint8\t。 除非符号性很重要,否则在各种字符类型之间转换不会有任何危险。 但是在对这些类型执行任何形式的算术时都要小心,因为它会带来许多陷阱。看见 简短答复:

诸如TEST之类的字符串文本在C中属于char[]类型

因此,将函数更改为接受char*。或者将参数强制转换为unsigned char*,即使这是一个不太干净的解决方案

char背后的一些历史:

当涉及到字符类型时,C类型系统有点功能失调。在恐龙在地球上行走的早期,并没有规定每个默认字符是有符号的还是无符号的

有符号是有意义的,因为这使char与较大的整数类型一致。unsigned也有意义,因为不存在具有负索引的字符符号表

在语言标准化之后,已经有各种编译器赋予字符不同的符号。因此决定char的符号性应该由实现定义。即:每个编译器决定

出于同样的原因,char、signed char和unsigned char类型被声明为3种不同的类型。这意味着您不能在指向这些类型的指针之间进行隐式转换。相反,您需要通过强制转换使用显式转换

只有角色类型表现得如此怪异。以int和signed int为例,它们总是兼容的,int总是有符号的

这是C语言的一个已知缺点。因此,stdint.h库中的类型优先于原始字符类型

使用字符类型的最佳实践:

如果要处理多达8位的文本字符串,请使用char类型,并且仅在该类型。 如果处理原始二进制数据或执行类型punning等操作,请使用unsigned char或uint8\t类型。 如果正在执行有符号8位整数算术,请使用有符号字符或整数。 如果正在执行无符号8位整数算术,请使用无符号字符或uint8\t。 除非符号性很重要,否则在各种字符类型之间转换不会有任何危险。 但是在对这些类型执行任何形式的算术时都要小心,因为它会带来许多陷阱。看见
也许在您的环境中,字符串文字是有符号的字符*?TEST也是一个常量。@Gemtylor True,但与所讨论的警告消息无关。@SouravGhosh实际上,字符是否有符号也不重要。char[]无法自动转换为带符号的char*或unsigned char*@SouravGhosh OK,因此常量转换可能会生成不同的警告,但现在一个像样的C编译器应该会为其生成警告或错误。可能在您的环境中,字符串文字是带符号的char*?也可能是
ST是一个常量。@Gemtylor为True,但与所讨论的警告消息无关。@SouravGhosh实际上,即使字符未签名也不重要。char[]无法自动转换为带符号的char*或unsigned char*@SouravGhosh OK,因此const const conversion可能会生成不同的警告,但现在一个像样的C编译器应该为其生成警告或错误。对于char*,“参数作为unsigned char*”应该是“参数类型为unsigned char*”。这些术语有一些历史性的混合,但C标准将参数定义为作为函数声明一部分声明的对象,该声明在函数项上获取值,并将参数定义为函数调用括号中的表达式。换句话说,参数是传递的表达式,参数是接收的对象的容器。虽然字符串文字的类型为char[],但它不会传递给函数。首先,它会自动转换为char*,因此传递给函数的是char*,而不是字符串文字或char[]。或者到char*“参数作为无符号char*”应该是“参数类型为无符号char*”。这些术语有一些历史性的混合,但C标准将参数定义为作为函数声明一部分声明的对象,该声明在函数项上获取值,并将参数定义为函数调用括号中的表达式。换句话说,参数是传递的表达式,参数是接收的对象的容器。虽然字符串文字的类型为char[],但它不会传递给函数。首先,它会自动转换为char*,因此传递给函数的是char*,而不是字符串文字或char[]。