我遇到内存访问问题。当i = 0
时,Visual Studio会引用异常,并引用以下代码中标记的行。
无法访问0x00AD8B3B
和0x00AD8B3B
等于scr+np-i
如何修复for-loop主体以解决此问题?
int o_strrev(char* scr)
{
int np = strlen(scr) - 1;
char tmp;
if (!scr) return -1;
if (!*scr) return -1;
for (int i = 0; i < np / 2; i++)
{
tmp = scr[np-i];
scr[np-i] = scr[i]; # this line
scr[i] = tmp;
}
return 0;
}
答案 0 :(得分:2)
正如@Revolver_Ocelot所指出的,你可能正在从字符串文字传递const char*
。根据定义,由于这些是不变的,因此您无法按照您尝试的方式对其进行修改。您需要一些方法将const char*
转换为非常量char*
。这些方面的东西对你有用:
string str = "string";
char* cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
我使用非常量char*
在g ++中编译了你的代码,它运行正常。请记住,当您完成此操作后,请取消分配char*
。我们不希望内存泄漏;)
答案 1 :(得分:1)
我看到你正试图扭转字符串。 我可以建议一个更简单的方法
void reverse(char *string_var)
{
int length, c;
char *begin, *end, temp;
length = strlen(string_var);
begin = string_var;
end = string_var;
for (c = 0; c < length - 1; c++)
end++;
for (c = 0; c < length/2; c++)
{
temp = *end;
*end = *begin;
*begin = temp;
begin++;
end--;
}
}
确保传递表单
的字符数组char word[64]
或者可能通过递归
void reverse(char *x, int begin, int end)
{
char c;
if (begin >= end)
return;
c = *(x+begin);
*(x+begin) = *(x+end);
*(x+end) = c;
reverse(x, ++begin, --end);
}
答案 2 :(得分:1)
您最有可能使用字符串文字调用o_strrev
,例如:
o_strrev("This ain't gonna work!");
这将与大多数编译器一起编译,并且最多会生成警告。尝试提高你的警告级别。
相反,您希望在堆上创建字符串的动态副本,并使用指向该字符串的char*
指针,如:
string str = "This is gonna work!!"
size_t len = str.size();
char* my_string = new char[len + 1];
strncpy(my_string, str.data(), len)
my_string[len] = '\0';
o_strrev(my_string);
// ...
delete[] my_string;