在Visual C++ 2008中解除引用char指针时出现未处理的异常

2 c++ pointers visual-studio-2008 dereference

我正在尝试在Visual C++ 2008中进行一些经典的C开发,它将修改字符串的字符,如下所示:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}
Run Code Online (Sandbox Code Playgroud)

当我尝试更改角色时,我遇到了未处理的异常.看起来我可以在Visual Studio 6中使用gcc或者使用gcc,但也许我只是忘记了一些东西.Visual Studio是否以某种方式通过值传递char*(管理内存).如果是这样,我该如何关闭它?

Ada*_*eld 8

你可能在某处传递一个字符串文字:

ModifyString("oops");  // ERROR!
Run Code Online (Sandbox Code Playgroud)

C和C++允许您从字符串文字(具有类型const char[])隐式转换为char*,但不推荐使用此类用法.允许在只读内存中分配字符串常量(它们通常是),因此如果您尝试修改它们,您将获得访问冲突(即分段错误或总线错误).如果编译器没有将字符串常量放在只读内存中,程序仍然可以工作,但它是未定义的行为.

执行此操作的正确方法是将字符串复制到可写缓冲区:

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok
Run Code Online (Sandbox Code Playgroud)