[英]segmentation fault during memcpy
我试图做一个功能,以反转字符串的一部分的顺序。 我是刚接触指针的人,由于某种原因,我可以访问字符串字符的位置以复制子字符串,但是我无法将它们放回相同的位置...
当我尝试将反向子字符串复制回其原始位置时,我得到
程序收到信号SIGSEGV,分段故障。 0x00007ffff7b5dc66 in ?? ()来自/lib/x86_64-linux-gnu/libc.so.6
任何帮助都是极好的!
这是我到目前为止的内容:
void reverse(char* line, int start, int end){
char str[end-start];
memcpy ( str , line + start , end-start );
reverseSubString ( str );
memcpy ( line + start, str , end-start );
}
void reverseSubString(char* str){
int i, j, len;
char temp;
i=j=len=temp=0;
len=strlen(str);
for (i=0, j=len-1; i<=j; i++, j--)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
char str[end-start];
memcpy ( str , line + start , end-start );
除非包括原始字符串的0终止符,否则您的char
数组不以0终止。 所以
len=strlen(str);
计算谁知道什么(如果尚未崩溃)。 然后
for (i=0, j=len-1; i<=j; i++, j--)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
访问分配的内存之外的内容。
reverseSubstring()
需要以NUL结尾的C字符串,因为它在传入的字符串上调用strlen()
。但是,您无法在reverse
函数中以NUL结尾的字符串。 这样做,或者甚至更好,传入一个length
参数:
void reverseSubString(char *str, size_t len)
{
int i, j;
char temp;
for (i = 0, j = len - 1; i <= j; i++, j--) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
void reverse(char *line, int start, int end)
{
char str[end - start];
memcpy(str, line + start, end - start);
reverseSubString(str, end - start);
memcpy (line + start, str, end - start);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.