我在尝试做一些经典的C的发展,在视觉C++2008年,将修改的字符串像这样:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

我得到一个未经处理的异常,当我试图改变一个角色。这似乎是我能做这些工作室6或使用的海湾合作委员会,但也许我只是忘了什么东西。不Visual Studio以某种方式通过char*由的价值(管理存储器)。如果是这样,我怎么把这关掉吗?

有帮助吗?

解决方案

您可能正在传递一个字符串文字的地方:

ModifyString("oops");  // ERROR!

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

其他提示

是对输入字符串文字?这可能是问题。否则,你将需要发布更多的代码,如指针莫名其妙地结束了在内存的只读位置指示。

这是不可能回答这个问题没有看到如何ModifyString。功能本身是正确的假设,它的合同是可以通过一个非空值。

然而它可以对电话网站的失败通过这样做任何事情

  • 通过空
  • 通过const char通过一个邪恶的铸造

我不能说究竟为什么,这并不工作,但问题是在你的代码,而不是Visual Studio中。出于某种原因,你传递一个无效的指针指向功能。它可以是一个空指针,或者它指向你没有读访问某些地址。

如果您发布一些代码(其中是调用的函数,它是怎么叫?),我们也许能指出确切的问题。

它在GCC或VC6工作的原因是很简单,这是未定义的行为。 C ++标准不说,“这应该工作”,或者“这应该会导致崩溃”。如果你写你没有访问存储任何事情都有可能发生。并根据编译器和系统,您正在运行,你最终会访问该地址将改变应用程序。侥幸得来的,你打的时候用VC2008编译导致访问冲突的地址。在GCC和VC6,你没有那么幸运,并得到了代码的出现工作的,并简单地写了一些垃圾地址。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top