此代码正在编译清理。但是当我运行它时,它会在第9行给出异常“访问冲突写入位置”。
void reverse(char *word)
{
int len = strlen(word);
len = len-1;
char * temp= word;
int i =0;
while (len >=0)
{
word[i] = temp[len]; //line9
++i;--len;
}
word[i] = '\0';
}
答案 0 :(得分:7)
您是否在调试器中完成了此代码?
如果没有,当i
(从0增加)通过len
(向0减少)时会发生什么?
请注意,您的两个指针word
和temp
具有相同的值 - 它们指向相同的字符串。
答案 1 :(得分:4)
注意:并非C ++程序中的所有字符串都是可写的。即使您的代码很好,当有人用字符串文字调用它时,它仍然会崩溃。
答案 2 :(得分:3)
当len
变为0时,您将访问字符串开头之前的位置(temp[0-1]
)。
答案 3 :(得分:2)
试试这个:
void reverse(char *word)
{
size_t len = strlen(word);
size_t i;
for (i = 0; i < len / 2; i++)
{
char temp = word[i];
word[i] = word[len - i - 1];
word[len - i - 1] = temp;
}
}
答案 4 :(得分:1)
该函数看起来不会崩溃,但它无法正常工作,它将从word [-1]读取,这不太可能导致崩溃,但这是一个问题。您的崩溃问题可能是您传入了编译器放入只读数据段的字符串文字。
这样的事情会在许多操作系统上崩溃。
char * word = "test";
reverse(word); // this will crash if "test" isn't in writable memory
您的算法也存在一些问题。您有len = len-1
以及之后的temp[len-1]
这意味着永远不会读取最后一个字符,而当len == 0时,您将从之前的第一个字符中读取。另外,temp和word都是指针,因此它们都指向相同的内存,我认为你的意思是创建一个 copy 的单词,而不仅仅是指向word的指针的副本。您可以使用strdup复制word
。如果你这样做,并用len修复你的一个一个问题,那么你的函数应该可以工作,
但是仍然无法修复写入崩溃,这是由您未向我们展示的代码引起的。
哦,如果您使用strdup
,请务必在离开此功能前致电free
以免费temp
。
答案 5 :(得分:0)
嗯,首先,当len == 0
len-1为负数时。这非常违法。其次,你的指针很可能指向一个未保留的内存区域。
答案 6 :(得分:0)
如果你按照以下方式调用该函数:
reverse("this is a test");
然后至少有一个编译器将传入一个只读字符串,因为你可以向后兼容C语言 将字符串文字作为非const char *传递。