0

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

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

关于我做错了什么有什么建议吗?谢谢。

大学教师

4

3 回答 3

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";

很好,因为您实际上创建了一个所需大小的数组并用该内容填充它。这不再是指向字符串文字的指针。

于 2012-08-14T00:40:49.867 回答
1

你不能改变文字,你只能改变一个变量。您正在尝试执行与此等效的操作:

void increment(int &f) { ++f; }

increment(2);

显然这没有任何意义。要修改一个值,它必须存储在您的代码分配的内存中的某个位置。如果不先复制常量,就无法修改它。

于 2012-08-14T00:42:39.097 回答
0
char* buffer="abc   def ghi\0";

它是一个常量字符串,你不能修改它。

大多数编译器都会给你一个警告,因为你使用char *(不是const char *)指向 const 字符串。

于 2012-08-14T00:45:52.667 回答