【问题标题】:#define a string literal then assign it to a char*#定义一个字符串文字,然后将其分配给一个字符*
【发布时间】:2014-06-05 10:23:24
【问题描述】:
#define MAXSTR "Maximum number reached"

char *str = MAXSTR;

在做这种操作的时候。代码运行良好,但出现 lint 错误。我该如何解决?

Error:
Assignment of string literal to variable 

如果我使用:

 #define MAXSTR "Maximum number reached"

 char *str = (char *) MAXSTR;

然后 lint 错误:

Attempt to cast away const (or volatile)

【问题讨论】:

标签: c pointers macros constants lint


【解决方案1】:

宏是赋予代码片段的名称。无论名称出现在源文件中的何处,都会被代码片段替换。宏定义是 C 预处理器的指令。它们不是声明,因为它们不是executed。它们甚至在预处理阶段之后都不存在,因此不会生成任何汇编代码。

MAXSTR 是一个由字符串文字"Maximum number reached" 替换的宏。字符串文字是只读的,尝试修改它们是未定义的行为。因此,您应该使指针const 合格。

#define MAXSTR "Maximum number reached"

const char *str = MAXSTR;  // make the pointer const

【讨论】:

  • 我尝试使用 const char* str 然后错误是:尝试抛弃 const (或 volatile)
  • @kapilddit 您必须初始化 const 对象,即在同一语句中定义和分配它们。您不能在单独的语句中定义然后分配它。
  • @ajay #define MAXSTR "Maximum number reached" const char *str = MAXSTR;。为什么这会出错?我仍然不确定这一点。
【解决方案2】:

将字符串文字赋值给变量

这是一个可怕的错误信息。我很好奇 Lint 认为字符串文字有什么好处,如果我们不能将它们分配给变量......它应该说:“将字符串文字分配给非常量指针”。

尝试抛弃 const(或 volatile)

警告不正确。同样,它应该告诉您指针变量必须是const

总而言之,你得到这些错误是因为你的静态分析工具不好。


解释:

C 中的字符串文字是字符数组,char []。不幸的是,语言没有将它们视为常量类型const char[]。这是 C 语言中的一个缺陷,因为如果您尝试对字符串文字进行写访问,那么它会导致未定义的行为,并且程序可能会崩溃和烧毁。因此,您必须将字符串文字视为 const 数组,即使它们不是。

因此,最好始终将指向字符串文字的指针声明为const char*

在 Lint 的情况下,它似乎将字符串文字视为const char[],但事实并非如此。因此,它会给您不正确的错误,而不是指出实际问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多