Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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
C++ 当原始数据为常量时,是否需要修改指针指向的位置?_C++_Pointers_Constants_Undefined Behavior - Fatal编程技术网

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%正确的。您有一个指向const
p
的指针,可以将其重新指向其他对象。一切良好,状态良好


第二段代码格式不正确。如果原始对象是const限定的(字符串文字是哪个),则删除consness后不能修改对象

你的第一个例子很好。如果有指向常量数据的非常量指针,则可以自由重新分配指针。要使其无法编译,必须使用
constchar*constp=“foo”我更改了第二个示例。我的意思是错的。很抱歉没有康斯特,还有一个小问题。在第二个示例中,如果我的数据不是常量:
char*const p=“foo”,执行
(*(char**)和p)=(char*)malloc(strlen(p))是UB吗?@JoãoPaulo在你的第二个例子中
p
const
所以它是UB
char const*
是指向
const char
的非常量指针
char*const
是指向非常量
char
const
指针。