为什么我在指针操作中遇到访问冲突异常?

时间:2011-02-27 10:12:03

标签: c++ .net-4.0

我在Windows 7.0 x64上使用C ++ Visual Studio .Net 4.0。这只发生在while语句的第一个循环上。

int main()
{
  char *string = new char[11];

  string = "characters\0";

  toUppercase(string);

  return 0;
}



void toUppercase(char *stringPtr)
{
 while(*stringPtr != '\0')
 {
    if(*stringPtr >= 'a' && *stringPtr <= 'z')
    {
        *stringPtr = *stringPtr - 32; // this is the culprit
    }

    ++stringPtr;    
 }
}

3 个答案:

答案 0 :(得分:6)

我怀疑你做的是这样的事情:

toUppercase("test");

问题是"test"const char的数组,而不是char,因此无法修改。但是,由于非常愚蠢的弃用特殊转换,无论如何都可以将字符串文字视为char*

(您的功能也无法测试toUppercase(0)。)

答案 1 :(得分:2)

我的猜测是你传递给该函数一个指向驻留在只读内存中的字符串的指针。但是,您需要共享周围的代码 - 即,您实际上如何调用此方法 - 来查明问题。

编辑:鉴于上述情况,以下是实现此目的的一种方法:

char* str = strdup("hello world");
toUppercase(str);

答案 2 :(得分:2)

如果内存不可写,你可以获得#AV:

toUppercase((char*)"str");