我正在尝试对函数中的字符串进行一些简单的更新,我得到以下示例:
void change(char* buffer) {
buffer[0] = 'b';
}
void main() {
char buffer[20] = "abc def ghi j\0";
printf("before: .%s., %p\n", buffer, buffer);
change(buffer);
printf("after: .%s.\n", buffer);
}
但是如果我使用char *作为缓冲区而不是char [],我会在函数中出错。因此以下示例不起作用:
void compact(char* buffer) {
buffer[0] = 'b';
}
void main() {
char* buffer="abc def ghi\0";
printf("before: .%s., %p\n", buffer, buffer);
change(buffer);
printf("after: .%s.\n", buffer);
}
有关我做错的任何建议吗?感谢。
唐
答案 0 :(得分:2)
如果您使用char*
,则您的变量指向字符串文字并调用未定义的行为。
您无法修改字符串文字。当你声明这样的指针
时char* buffer="abc def ghi\0";
buffer
将指向只读内存(可能是实现定义的)。无论如何,你不能改变它的内容。保留此语法是为了与C兼容,但是,IMO,这不应该编译。每当你看到类似的东西(char*
指向一个C字符串)时,立即将它翻译成你的脑袋,
const char* buffer="abc def ghi\0";
戴上你的C ++眼镜。如果你没有它们,可以买一双(你会看到各种各样的东西,比如这样,通过引用返回当地人,忘记返回等等)。
另一种情况:
char buffer[] = "abc def ghi\0";
很好,因为您实际上创建了一个所需大小的数组并用该内容填充它。这不再是指向字符串文字的指针。
答案 1 :(得分:1)
您无法更改文字,您只能更改变量。你正试图做相同的事情:
void increment(int &f) { ++f; }
increment(2);
显然这毫无意义。要修改值,必须将其存储在代码分配的内存中。如果不先复制常量,就无法修改常量。
答案 2 :(得分:0)
char* buffer="abc def ghi\0";
这是一个连续的字符串,你不能修改它。
大多数编译器会给你一个警告,因为你使用 char * (不是 const char * )点到const字符串。