(位置)访问违规写入位置的第一次机会异常

时间:2017-03-07 18:44:20

标签: c

我在程序中创建了一个交换函数,需要将字符串分隔为2个字符串。一个用于所有小写字母,另一个用于所有大写字母,我在调试时遇到此错误。

  

upper_lower_letters.exe中0x001C185B处的未处理异常:0xC0000005:访问冲突写入位置0x001C5865。

这是功能

void swapChars(char arr[], int index1, int index2)
{
    char aux = ' ';

    aux = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = aux;

}

我在这一行得到错误

arr[index1] = arr[index2];

我从这个函数调用函数

void sortLowerUpperCase(char str[])
{
    int i = 0, lowerC = 0, upperC = 0;
    int lowerIndexs[TH] = { 0 };
    int upperIndexs[TH] = { 0 };
    char lowerCaseStr[TH] = { 0 };
    char upperCaseStr[TH] = { 0 };

    for (i = 0; i < strlen(str); i++)
    {
        if (str[i] >= 'a' && str[i] <= 'z')
        {
            lowerIndexs[lowerC] = i;
            lowerC++;
        }
    }

    for (i = 0; i < lowerC; i++)
    {
        swapChars(str, lowerIndexs[i], i);
    }

    strcpy(lowerCaseStr, str);

    puts(lowerCaseStr);
}

主要是我这样称呼sortLowerUpperCase

sortLowerUpperCase("LiDoR");

这是调试窗口中变量的值:

所以它现在超出了数组的范围。 我能做些什么让它发挥作用?

1 个答案:

答案 0 :(得分:0)

main功能中,将来电替换为sortLowerUpperCase("LiDoR");

char * string = (char *)malloc(6);
strcpy(string, "LiDoR");
sortLowerUpperCase(string);

<强>原因

在C中,字符串文字是在大多数体系结构的内存的只读区域中创建的。稍后,当您尝试编写/替换只读内存部分中的字符串文字的某些部分(在语句arr[index1] = arr[index2];arr[index2] = aux;中)时,您显然会收到此错误(seg fault) 。因此,为了避免意外地将内存写入只读部分,您应该自己创建内存(使用malloc或使用数组),然后将字符串文字复制到该内存。

相关问题