未经处理的例外时取消引用char指针在视觉C++2008年
-
12-09-2019 - |
题
我在尝试做一些经典的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,你没有那么幸运,并得到了代码的出现工作的,并简单地写了一些垃圾地址。