memcpy期间的分段错误

时间:2013-02-26 22:38:32

标签: c reverse memcpy memmove

我正在尝试创建一个反转字符串部分顺序的函数。我是新手使用指针,由于某种原因,我可以访问我的字符串的字符位置来复制一个子字符串,但我不能把它们放回到相同的位置......

当我尝试将反转的子串复制回原来的位置时,我得到了

编程接收信号SIGSEGV,分段故障。 0x00007ffff7b5dc66在? ()来自/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;
    }
}

2 个答案:

答案 0 :(得分:3)

  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;
}

在分配的内存之外访问。

答案 1 :(得分:1)

reverseSubstring()期望NUL终止的C字符串,因为它在传入的字符串上调用strlen()。但是,您无法在reverse函数中终止字符串。要么这样做,要么更好,传递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);
}