char指针赋值的时刻之间的差异

时间:2017-01-24 18:40:21

标签: c c-strings

今天有人告诉我,这段代码:

int main(){
 char *a;
 a = "foobar";
 /* a used later to strcpy */
 return 0;
}

很糟糕,可能会导致问题和错误。 但是,我的代码工作没有任何问题,我不明白,这有什么区别,

int main(){
 char *a = "foobar";
 /* a used later to strcpy */
 return 0;
}

我被描述为"正确"办法。 有人可以形容,为什么这两个代码不同? 而且,如果第一个可能有问题,请举例说明这一点?

3 个答案:

答案 0 :(得分:3)

从功能上讲,它们是一样的。

在以前的代码段中,a被分配给字符串文字;在后者中,a用字符串文字初始化。 在这两种情况下,a都指向字符串文字(无法修改)。

没有理由认为一个比另一个更正确。我更喜欢后者 - 但这只是我个人的偏好。

答案 1 :(得分:1)

两个片段都同样糟糕,因为两个片段都以指向const数据的非const指针结束。如果非常量指针用于(尝试)更改数据,您将获得未定义行为:一切都可能发生在工作程序崩溃,包括修改指令被忽略

正确的方法是使用const指针或初始化非const数组。

const char *a = "foobar";

char a[] = "foobar";

但要注意,在后一种情况下,你有一个真正的数组而不是指针,所以如果你真的需要指针语义,你也可以这样做:

char _a[] = "foobar";
char *a = _a;

答案 2 :(得分:1)

有些地方有编码标准,例如帮助像Coverity这样的工具进行静态代码分析。

我已经看过几个地方的编码实践规则是变量应该总是被声明为初始化,以简化事情,使分析更容易。

您的第二个代码段比第一个代码段更接近该规则,因为无法插入新代码,a可以未初始化使用。

在代码维护方面,这是一个积极的好处。