我可以初始化一个* char吗?

时间:2012-07-03 14:43:00

标签: c++

在页113,在C ++编程语言中 (第三版和特别版),Stroustrup声明:

struct address {
char * name ; // "Jim Dandy"
long int number ; // 61
//...
};

void f ()
{
address jd ;
jd.name = "Jim Dandy"; // Is this possible?
jd.number = 61 ;
}

这是否可行,因为没有为jd的char *字段分配任何内存?

更新:谢谢大家的回答!鉴于它不安全,我不会使用它。当我在书中看到它时,它引起了我的注意。

2 个答案:

答案 0 :(得分:2)

分配足够的内存来保存指向char的指针,并且赋值将指针设置为指向保存字符串"Jim Dandy"的静态缓冲区,所以是的,这是可能的。不需要分配,因为不复制字符串。

(但是,不建议将char*设置为字符串文字;请改用char const*。)

答案 1 :(得分:2)

分配了内存:足够用于指针。现在指向包含字符串的静态数组。

如果您希望它在结构中放置字符串的副本,那么这不是C样式字符串的工作方式;如果您想要这种行为,那么请改用C ++ std::string类。

我希望这个例子继续解释这是多么危险。静态数组是常量,但语言的一个怪癖意味着你可以指定一个非const指针指向它。这允许您编写试图修改常量对象的代码,该代码在运行时提供未定义的行为:

jd.name[0] = 'T'; // BOOM! Undefined behaviour.

如果你很幸运,编译器可能会警告你这个错误。您可以通过声明指针const

来阻止它
char const * name;
...
jd.name[0] = 'T'; // Gives a friendly compile-time error