const限定符警告

时间:2015-11-20 15:43:23

标签: c char const warnings

我收到一堆警告信息告诉我

Warning C4090   '=': different 'const' qualifiers   cA4  c:\users\kyle\documents\visual studio 2015\projects\ca4\ca4\ca4.c  313

我需要编译我的代码,以便对此学校作业没有任何警告。一切正常,但我想知道为什么会这样。我正在分配一个“字符串”,它实际上是来自const数组的值的char *,以跟踪它们当前所在的城市。

像这样:

char* currentCityName = cityNames[currentCity];

警告发生在程序后面的这一行:

currentCityName = cityNames[currentCity];

cityNames宣言:

const char* cityNames[kNumberOfCities] = { "Toronto", "Atlanta", "Austin", "Santa Fe", "Denver", "Chicago", "Buffalo" };

显然,我设置此变量的一些方法是不正确的,编译器不喜欢它。

我正在寻找一个解释为什么会发生这种情况以及我应该做什么而不是这个。

2 个答案:

答案 0 :(得分:1)

你说

  

我正在分配一个“字符串”,它实际上是来自const数组

的值的char *

从那个和错误信息我认为你的意思是你有

const char *cityNames[<some bound>];

是指向内容为const的字符串的指针数组。如果你也有

char *currentCityName;

然后你尝试执行

currentCityName = cityNames[currentCity];

然后,指向可修改字符的结果指针实际上指向其他地方声明为const的字符。这种不匹配可能会导致程序在没有任何其他警告的情况下尝试修改const数据,但结果不明确。

您可以通过声明currentCityName来清除该警告:

const char *currentCityName;

匹配要分配给它的值的真实类型。或者,您可以制作城市名称的可修改副本,并在此处指向currentCityName。如果您想(安全地)修改指向数据,则需要制作副本。

答案 1 :(得分:0)

我假设cityNames被声明为const,所以当你分配值(不复制内容)时,它会丢弃const限定符。

换句话说,因为const你不能改变cityNames中的任何东西,但你有另一个指针,这次是非const,并允许你改变数据,尽管它最初标记为const