当我编译给定代码时,它不会产生任何错误或警告。我的问题是,在编译以下行*err = "Error message";
时,编译器不应该产生错误,因为我们解除引用指向常量字符的指针并为其分配字符串。
是否允许在指针内指定除地址之外的任何内容以及在此给定方案中发生的具体情况?
#include <stdio.h>
void set_error(const char**);
int main(int argc, const char* argv[])
{
const char* err;
set_error(&err);
printf("%s",err);
return 0;
}
void set_error(const char** err1)
{
*err1 = "Error message";
}
答案 0 :(得分:9)
const char** err1
这是指向常量对象的非常量指针的指针。取消引用它会给出一个非常量指针(对于一个常量对象),可以将其指定为。
要防止分配到const char*
,那也必须是const
:
const char * const * err1
答案 1 :(得分:4)
"Error message"
不是std::string
。这是一个const char[]
。 C ++中的所有字符串文字都是const char[]
。在C中,它们是char[]
。
答案 2 :(得分:1)
是否允许在指针内指定除地址之外的任何内容以及在此给定方案中发生的具体情况?
您可以指定指针的指针。您将指针视为地址,理解概念很好,但不要将其与数据类型混合。数据类型是指针,而不是地址。例如,要将内存中的地址分配给指针,需要将其转换为指针:
char *pointer = reinterpret_cast<char *>( 0xA000000 );
您可能会问这会如何编译?
int array[10];
int *ptr = array;
来自C - 数组可以隐式转换为指向第一个元素的指针。所以它再次指向指针。现在关于带双引号的字符串文字。它也是一个数组:
const char str[] = "str";
const char str[] = { 's', 't', 'r', '\0' };
这两个陈述几乎相同。并且由于数组可以隐式转换为指向第一个元素的指针,因此可以将其分配给const char *