Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以初始化*字符吗? 页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 ; }_C++ - Fatal编程技术网

我可以初始化*字符吗? 页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 ; }

我可以初始化*字符吗? 页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 ; },c++,C++,由于没有为jd的char*字段分配任何内存,这可能吗 更新:谢谢大家的回答!考虑到它不安全,我不会用它。当我在书中看到它时,它引起了我的注意。分配了足够的内存来保存指向char的指针,并且分配将指针设置为指向保存字符串Jim Dandy的静态缓冲区,因此是的,这是可能的。由于未复制字符串,因此不需要分配 但是,不推荐将char*设置为字符串文字;改为使用char const*。分配了足够的内存来保存指向char的指针,分配将指针设置为指向保存字符串Jim Dandy的静态缓冲区,因此是的,这是可

由于没有为jd的char*字段分配任何内存,这可能吗


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

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


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

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


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

已分配内存:足以容纳指针。现在,它指向包含字符串的静态数组

如果您希望它在结构中放置字符串的副本,那么这不是C样式字符串的工作方式;如果你想要那个行为,那么使用C++ STD::String类代替.< /P> 我希望这个例子能继续说明这有多危险。静态数组是常量,但语言的一个怪癖意味着您可以指定一个非常量指针指向它。这允许您编写尝试修改常量对象的代码,该对象在运行时提供未定义的行为:

jd.name[0] = 'T'; // BOOM! Undefined behaviour.
如果幸运的话,编译器可能会警告您这个错误。您可以通过声明指针常量来防止它:


内存已分配:足够一个指针使用。现在,它指向包含字符串的静态数组

如果您希望它在结构中放置字符串的副本,那么这不是C样式字符串的工作方式;如果你想要那个行为,那么使用C++ STD::String类代替.< /P> 我希望这个例子能继续说明这有多危险。静态数组是常量,但语言的一个怪癖意味着您可以指定一个非常量指针指向它。这允许您编写尝试修改常量对象的代码,该对象在运行时提供未定义的行为:

jd.name[0] = 'T'; // BOOM! Undefined behaviour.
如果幸运的话,编译器可能会警告您这个错误。您可以通过声明指针常量来防止它:


并不是说不赞成将char*设置为字符串文字,这只是一种不安全的做法,但即使如此,也可以将其转换为char[].@RichardJ.RossIII:my GCC抱怨从字符串常量转换为“char*”。您运行的GCC版本是什么,您启用了哪些编译器标志?@RichardJ.RossIII:C++03或可能的C++98中不推荐对char*的隐式转换,并使其在C++11中无效;虽然我的编译器即使在C++11中也接受了它,但仍然有一个警告。并不是说不推荐将char*设置为字符串文字,这不是一个安全的做法,但即使这样,也可以将其转换为char[]@RichardJ.RossIII:my GCC抱怨从字符串常量到“char*”的转换不推荐使用。您正在运行哪个版本的GCC,以及您启用了哪些编译器标志?@RichardJ.RossIII:C++03或可能是C++98中不推荐使用到char*的隐式转换,并且在C++11中无效;尽管我的编译器即使在C++11中也会接受它,并发出警告。如果Stroustrup声明它是可能的,那么它肯定是可能的:@dasblinkenlight:或者至少,它是可能的,但在写这本书时已被弃用。在C++11中,如果不添加常量,这应该是不可能的。如果Stroustrup声明这是可能的,那么它肯定是可能的:@dasblinkenlight:或者至少,这是可能的,但在写这本书时已被弃用。在C++11中,如果不添加常量,这是不可能的。