我在程序中创建了一个交换函数,需要将字符串分隔为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");
这是调试窗口中变量的值:
所以它现在超出了数组的范围。 我能做些什么让它发挥作用?
答案 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
或使用数组),然后将字符串文字复制到该内存。