在C中的字符串反转期间释放指针时的段错误

时间:2013-03-10 15:39:19

标签: c string segmentation-fault

int main(int argc, char **argv){
    char *str = argv[1];
    size_t len = strlen(str);
    char *dst = calloc(len+1, sizeof(char));
    int i;
    for(i=len-1; i>=0; i--){
        memcpy(dst, str+i, 1);
        dst++;
    }
    *(++dst) = '\0';
    printf("%s\n", dst);
    free(dst);
    return 0;
}

忽略错误检查以提高可读性
我不明白为什么我得到这个消息的段错误:“glibc free():指针无效:” 我正在尝试编写一个使用指针反转字符串的小程序但是:
1)最后一次打印没有打印;
2)我有一个段错误

3 个答案:

答案 0 :(得分:9)

你有:

   char *dst = calloc(len+1, sizeof(char));
   /* ... */
   *(++dst) = '\0';
   /* ... */
   free(dst);

您必须freemalloc / calloc分配的指针。在这里你修改了它。复制一份,以便free之后可以。

答案 1 :(得分:3)

问题是你正在改变计算中的指针 尝试使用temporiginal,例如:

int main(int argc, char **argv){
    char *str = argv[1];
    size_t len = strlen(str);
    char *dst = calloc(len+1, sizeof(char));
    char *origDst = dst;
    int i;
    for(i=len-1; i>=0; i--){
        memcpy(dst, str+i, 1);
        dst++;
    }
    *(dst) = '\0';
    printf("%s\n", origDst);
    free(origDst);
    return 0;
}

答案 2 :(得分:1)

有两点需要考虑。一个是制作由calloc分配的原始指针的副本,由ouah共享。另一点是在存储NULL时消除指针的增量,即*(++dst) = '\0';应为*dst = '\0';。通过这两项更改,我可以毫无问题地运行您的程序。