1

在第 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* 字段分配任何内存,这可能吗?

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

4

2 回答 2

2

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

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

于 2012-07-03T14:45:17.457 回答
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
于 2012-07-03T14:47:29.647 回答