在页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 *字段分配任何内存?
更新:谢谢大家的回答!鉴于它不安全,我不会使用它。当我在书中看到它时,它引起了我的注意。
答案 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