C++ 当原始数据为常量时,是否需要修改指针指向的位置?
当指针的数据为常量时,更改指针指向的位置是否是未定义的行为?例如:C++ 当原始数据为常量时,是否需要修改指针指向的位置?,c++,pointers,constants,undefined-behavior,C++,Pointers,Constants,Undefined Behavior,当指针的数据为常量时,更改指针指向的位置是否是未定义的行为?例如: const char* p = "foo"; p = "boo"; char* const p = "foo"; (*(char**)&p) = (char*)malloc(strlen(p)); 我相信这不是UB,因为指针本身不是常量,并且我没有修改“foo”对象 额外问题:不改变常量指针的常量数据?会是UB吗?例如: const char* p = "foo"; p = "boo"; char* const p
const char* p = "foo";
p = "boo";
char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
我相信这不是UB,因为指针本身不是常量,并且我没有修改“foo”
对象
额外问题:不改变常量指针的常量数据?会是UB吗?例如:
const char* p = "foo";
p = "boo";
char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
我相信这不是UB,因为指针本身不是常量,并且我没有修改“foo”对象
这是正确的。指针不是const
,因此如果需要,可以将其更改为指向其他对象。在这种情况下,它不会导致meory泄漏,但请记住,如果指针指向分配给new
的数据,并且它是指向该数据的唯一指针,则需要在重新分配指针之前调用delete
,否则将导致meory泄漏
额外的问题:移除指针的常数?会是UB吗
只有当您试图修改从中删除的const
对象时,它才是UB,在本例中,您就是这样做的。只需删除const
就可以了,有时也需要这样做,但除非对象不是const
,否则永远不允许修改对象。例如,以下内容是合法的,因为foo
不是const
int foo = 42;
void bar(int const& baz) { const_cast<int&>(baz) = 21; }
int main()
{
bar(foo);
}
intfoo=42;
空条(int const&baz){const_cast(baz)=21;}
int main()
{
酒吧(富);;
}
另一方面
const int foo = 42;
void bar(int const& baz) { const_cast<int&>(baz) = 21; }
int main()
{
bar(foo);
}
const int foo=42;
空条(int const&baz){const_cast(baz)=21;}
int main()
{
酒吧(富);;
}
不合法,因为
foo
是const
第一个代码片段中的代码是100%正确的。您有一个指向constp
的指针,可以将其重新指向其他对象。一切良好,状态良好
第二段代码格式不正确。如果原始对象是const限定的(字符串文字是哪个),则删除consness后不能修改对象 你的第一个例子很好。如果有指向常量数据的非常量指针,则可以自由重新分配指针。要使其无法编译,必须使用
constchar*constp=“foo”代码>我更改了第二个示例。我的意思是错的。很抱歉没有康斯特,还有一个小问题。在第二个示例中,如果我的数据不是常量:char*const p=“foo”代码>,执行(*(char**)和p)=(char*)malloc(strlen(p))代码>是UB吗?@JoãoPaulo在你的第二个例子中p
是const
所以它是UBchar const*
是指向const char
的非常量指针char*const
是指向非常量char
的const
指针。