更新char * function C ++

时间:2012-08-14 00:38:46

标签: c++ function

我正在尝试对函数中的字符串进行一些简单的更新,我得到以下示例:

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);
}

有关我做错的任何建议吗?感谢。

3 个答案:

答案 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字符串。