为什么我不能声明unsigned char*test ="Some text"

xsa*_*i3x 5 c embedded visual-studio-2010

这在visual studio 2010中不起作用,它给我以下错误

void main (void)
{
     unsigned char* test = "ATGST"; 

}
Run Code Online (Sandbox Code Playgroud)

编辑1:我的问题是为什么这适用于嵌入式系统,但不适用于PC?

在此输入图像描述

但当我把它改为:

 char* test = "ATGST";  
Run Code Online (Sandbox Code Playgroud)

有用.

我使用C为嵌入式系统编写代码的主要内容是,我使用visual studio来测试某些功能,因此我不必在Micro-controller上实时测试它.

我需要一个解释,因为微控制器接受第一个代码.

小智 11

编辑以符合删除C++标记并安抚嵌入式标记.

首先,手头的问题,你试图将char[]文字传递给一个unsigned char*.你不能把char等同于unsigned或者signed,在这方面它有点特别.此外,字符串文字具有唯一存储空间,不应修改.如果你正在处理的字符,你需要使用一个标准 char*,其中char[]可衰变成.你可以强行施放它,但我不喜欢推荐这样的东西.正如其中一条评论所指出的那样,这样做是安全的.实际上,它实际上是一种非常罕见的东西,实际上是一个安全的简单.

但迄今为止紧张的答案提供足够reinterpret_casting资格,这基本上是说给你知道你在做什么,编译器的空间太小.这可能非常危险,只有在您对手头的问题非常肯定时才应该这样做.char通常只是通用的,甚至没有签名或未签名.由于unsigned char的范围大于char,并且通常char使用signed char的正子集来描述字符(或任何其他类型的数据),如果您的数据不在扩展的正范围内,那么'好好去.但是,要安全地符合环境和代码.

关于入口点功能 - 符合编辑

由于已经确定您在嵌入式系统上工作,这意味着您的程序很可能不需要返回任何内容,因此它可以保留void main()(也可能是它需要由给定的嵌入式系统指定的非常不同的返回,OP最了解他的系统所要求的要求).在很多情况下,你可以保持无效的原因是因为没有环境/操作系统可以安抚,没有人可以与之通信.但嵌入式系统也可以非常专业化,最好通过详细研究给定平台来实现,以满足强加的要求(如果有的话).

  • "我不喜欢推荐这样的东西" - 将指针强制转换为`(unsigned char*)`是你可以*做的少数安全指针转换之一,你总是可以将任何东西别名为`unsigned char`.Windows总是2的补码,所以你甚至不必担心`*((unsigned char*)ptr)!=(unsigned char)(*ptr)`的理论可能性.尽管如此,如果它指向一个字符串文字,那么它应该是C中的`(const unsigned char*)`,即使该语言不需要它:如此接近可推荐但到目前为止...... (2认同)

Pup*_*ppy 5

首先,你需要一个const.其次,char!= unsigned char,并且(唯一)!= signed char.

字符串文字的类型const char[N]- 适当的大小N,因此只能转换为const char*.请注意,语言有一个特殊的规则,让你含蓄地放下const ,但它仍然是UB修改字符串文字,使其成为一个非常糟糕的主意,这样做.

在这方面,微控制器的C实现是不一致的.最好简单地使用const char*,这是正确的,而不是试图破解VS接受错误的代码.

  • 问题是标记C,在C字符串文字中有类型`char [N]`,而不是`const char [N]`. (2认同)