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)我有一个段错误
答案 0 :(得分:9)
你有:
char *dst = calloc(len+1, sizeof(char));
/* ... */
*(++dst) = '\0';
/* ... */
free(dst);
您必须free
由malloc
/ calloc
分配的指针。在这里你修改了它。复制一份,以便free
之后可以。
答案 1 :(得分:3)
问题是你正在改变计算中的指针
尝试使用temp
或original
,例如:
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';
。通过这两项更改,我可以毫无问题地运行您的程序。