1
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(): invalid pointer:”
我正在尝试编写一个使用指针反转字符串的小程序,但是:
1)最后 printf 什么也不打印;
2)我有一个段错误

4

3 回答 3

9

你有:

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

您必须使用/free分配的指针。在这里你修改了它。复制它,以便以后可以使用。malloccallocfree

于 2013-03-10T15:40:23.337 回答
3

问题是您正在更改计算中的指针。
尝试使用tempororiginal类似的:

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;
}
于 2013-03-10T15:42:02.167 回答
1

有2点需要考虑。一是复制callocouah已经共享的原始指针。还有一点就是要消除指针在NULL存储时的增量,即*(++dst) = '\0';应该是*dst = '\0';。通过这 2 项更改,我可以毫无问题地运行您的程序。

于 2013-03-10T15:48:24.530 回答