将指针的元素分配给同一指针中的另一个元素
Assigning an element of a pointer to another element from the same pointer
我正在尝试为指针中的元素分配与同一指针中的另一个元素相同的值。
int testFunc() {
char *p = "123";
p[0] = p[2];
return 0;
}
想知道为什么上面的代码不起作用 - 实现我想要做的事情的最佳方法是什么?
您遇到此问题是因为您正在尝试修改 string literal which invokes undefined behavior。
问题在
p[0] = p[2];
而 p
指向一个 字符串文字 。
引用 C11
,章节 §6.4.5,字符串文字
[...] If the program attempts to modify such an array, the behavior is
undefined.
你需要一个数组来代替,不能修改内容,比如
char parr[] = "123";
然后
parr[0] = parr[2];
会做。
写char *p = "123"
时,p
指向只读内存4个字符的第一个元素。真的,你应该写 const char* p = "123"
来在语句 p[0] = p[2];
.
上引发编译时错误
如果要修改字符串则使用自动存储时长;即写
char[] p = "123";
p
是一个 char[4]
类型,最后一个元素有一个空终止符。
char *p = "123";
当你这样定义一个指针时,它会将数据保存在只读内存段,这就是你无法修改数据的原因
我正在尝试为指针中的元素分配与同一指针中的另一个元素相同的值。
int testFunc() {
char *p = "123";
p[0] = p[2];
return 0;
}
想知道为什么上面的代码不起作用 - 实现我想要做的事情的最佳方法是什么?
您遇到此问题是因为您正在尝试修改 string literal which invokes undefined behavior。
问题在
p[0] = p[2];
而 p
指向一个 字符串文字 。
引用 C11
,章节 §6.4.5,字符串文字
[...] If the program attempts to modify such an array, the behavior is undefined.
你需要一个数组来代替,不能修改内容,比如
char parr[] = "123";
然后
parr[0] = parr[2];
会做。
写char *p = "123"
时,p
指向只读内存4个字符的第一个元素。真的,你应该写 const char* p = "123"
来在语句 p[0] = p[2];
.
如果要修改字符串则使用自动存储时长;即写
char[] p = "123";
p
是一个 char[4]
类型,最后一个元素有一个空终止符。
char *p = "123";
当你这样定义一个指针时,它会将数据保存在只读内存段,这就是你无法修改数据的原因