如何解决为什么即使我可以访问内存,也会出现分段错误内核已转储?
我知道此反向字符串函数有更好的实现,我什至对此做得更好,但我只是想知道为什么它不起作用。
我有fun initActionBar() {
setSupportActionBar(toolbar_main)
actionBar.setDisplayHomeAsUpEnabled(true)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
MenuInflater(this).inflate(R.menu.toolbar_menu,menu)
return true
}
函数,它返回字符串的长度。
这是我的代码:
_strlen(char *)
我正在尝试深入地了解指针,目前我对它们并不了解很多,所以我非常感谢任何答案。
解决方法
@ user3121023的评论完全正确。
但即使您这样做 s = tmp 那将不起作用,因为它只是一个副本。 如果您通过** s,则您的代码可以正常工作
void rev_string(char ** s)
int长度= _strlen(* s);
将整个最后一个循环替换为 * s = tmp
这将按预期工作。 但是永远不要在实际程序中这样做,这是一个糟糕的解决方案。
,根据string literal的文档:
字符串文字是不可修改的(实际上可能放在.rodata之类的只读存储器中)。如果程序尝试修改由字符串文字形成的静态数组,则该行为是不确定的。
示例:
char* p = "Hello";
p[1] = 'M'; // Undefined behavior
char a[] = "Hello";
a[1] = 'M'; // OK: a is not a string literal
所以,这个
char *str = "five";
需要成为
char str[] = "five";
可修改。
此声明
tmp += length;
使tmp
指向内存在分配数组之后的一个元素。
并且,第一次使用
进行访问*tmp = *clone;
是Undefined Behavior的越界访问。
您可以使用valgrind进行验证。
您需要分配一个额外的字符以容纳空字符,因此长度应为:
const size_t length = strlen(s) + 1;
,分配为:
char* tmp = malloc(length * sizeof(*tmp));
// ^^^^^^^^^^^^
// sizeof to variable idiom
使用后需要释放已分配的内存,以避免内存泄漏。
这是工作示例(live):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void rev_string(char *s)
{
const size_t length = strlen(s) + 1;
char *clone = s;
char *tmp = malloc(length * sizeof(*tmp));
char *p = tmp + length - 1;
*p = '\0';
p--;
while (*clone)
{
*p = *clone;
p--;
clone++;
}
++p;
printf("TMP: %s,s: %s\n",p,s);
while (*p)
{
*s = *p;
p++;
s++;
}
free(tmp);
}
int main()
{
char str[] = "five";
rev_string(str);
printf("%s\n",str);
return (0);
}
输出:
TMP: evif,s: five
evif
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。