如果我这样做:
char *ptr = "hello";
然后我从MinGW编译器中得到警告:
warning: deprecated conversion from string constant to 'char*'
如果我忽略警告并执行此操作:
strcpy(ptr,"test");
然后我遇到了分段错误。
这个警告意味着什么? 我该如何解决这个问题?
答案 0 :(得分:3)
你的意思是什么?你缺少“*”字符。
char *ptr = "hello";
编译器给你一个警告,因为“hello”将在readonly内存段中创建,而你的“ptr”声明不会创建指向const char的指针。
如果将其声明为“const char * ptr”,则会创建一个指向const char的指针。
在任何情况下,您都不能将“hello”更改为其他内容,因为它位于readonly段中。尝试像strcpy()这样做会导致段错误。
答案 1 :(得分:1)
您可以通过将char* ptr
更改为const char* ptr
来解决此问题。
char * ptr
意味着您可以修改ptr
指向的值,该值对于字符串文字无效,因为它们被指定为不可变的。 C ++用于允许这种转换发生,但是它们使它贬值,因为它会导致不好的事情发生。这也是你的strcpy失败的原因,因为你试图覆盖内存中的不可变值。
编辑:如果您确实意味着char ptr
而不是char * ptr
,那么它会抱怨,因为您试图隐式转换字符串文字,这基本上是一个数组char
的{{1}},单个char
,不会按预期运行。我相信C ++标准曾经使用字符串文字中的第一个字符进行此转换,但是因为它导致了意外的行为而停止了它。
答案 2 :(得分:1)
此警告表示您正在尝试将字符串文字“hello”转换为char指针。我猜你在那句话中错过了*:
char* ptr = "hello"
您只需将代码更改为:
char ptr[] = "hello";
strcpy(ptr,"test")
答案 3 :(得分:1)
char* p = "hello";
这将声明一个指向字符数组的指针,该字符数组恰好指向字符串文字"hello"
。警告只是您的编译器告诉您它是一种不推荐使用的初始化字符数组的方法。
相反,声明字符串的更好(以及更多C ++方式)是:
std::string str = "Hello";
strcpy
失败,因为您声明的指针没有解决正确分配的内存位置(静态或动态)。因此,当它试图写入它时,它可能(试图)在任何地方写作。
答案 4 :(得分:0)
char是单个字符,而不是字符序列(字符串)。持有字符串us std :: string或chars数组。