2012-07-03 64 views
1

在113页,在C++编程语言 (第三版和特别版),斯特劳斯说:我可以初始化* char吗?

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的字符*领域的任何记忆?

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

+0

如果“斯特劳斯指出:”这是可能的,这是绝对有可能:) – dasblinkenlight

+0

@dasblinkenlight:或者至少,这是可能的(但不建议使用)这本书是写的时候。如果不添加'const',它在C++ 11中不应该是可能的。 –

回答

2

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

(但是,设置一个char*到字符串文字已弃用;使用char const*代替)

+0

这不是为字符串文字设置'char *'而已,这不是一种安全的做法,但即使如此,它也可以通过强制转换来键入'(char [])'。 –

+0

@ RichardJ.RossIII:我的GCC抱怨从字符串常量到'char *'的不赞成使用的转换。 –

+0

您运行的是哪个版本的GCC,以及您启用了哪些编译器标志? –

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 
相关问题