王道c语言-oj-free释放已经被移动过的指针

错误代码

#include <stdio.h>
#include <stdlib.h>
void fun(char *&p){
    p=(char*)malloc(100);
    fgets(p,100,stdin);
}
int main() {
    char *p;
    fun(p);
    while (*p!='\n'){
        printf("%c",*p);
        p++;
    }
    free(p);
    return 0;
}

在这里插入图片描述

修改后

在这个程序中,存在几个问题会导致错误输出:

  1. 指针移动的问题:你在 while 循环中不断移动指针 p,直到遇到换行符 \n。但是在 free(p) 时,你尝试释放的是已经被移动过的指针,而不是原始的指针位置。这会导致未定义行为,因为你不能释放一个已经被移动过的指针。

  2. 未处理末尾换行符fgets 会读取输入中的换行符,导致循环在遇到换行符时停止,但在这种情况下,循环的结束条件是遇到换行符,这可能会导致你丢失最后一个字符的打印。

要修正这些问题,可以将指针 p 保存在另一个指针变量中,然后使用这个保存的指针来释放内存。同时,调整循环条件,确保正确处理字符串的末尾。以下是修正后的代码:

#include <stdio.h>
#include <stdlib.h>

void fun(char *&p){
    p = (char*)malloc(100);
    fgets(p, 100, stdin);
}

int main() {
    char *p;
    fun(p);
    char *start = p; // 保存原始指针位置
    while (*p != '\0' && *p != '\n'){ // 确保处理字符串的末尾
        printf("%c", *p);
        p++;
    }
    printf("\n"); // 打印一个换行符,保证输出整洁
    free(start); // 释放原始指针位置的内存
    return 0;
}

在这个修改后的代码中:

  1. char *start = p; 保存了原始的指针位置。
  2. while (*p != '\0' && *p != '\n') 确保循环在遇到字符串结束或换行符时停止。
  3. free(start); 使用保存的原始指针位置来释放内存。

这样可以确保程序正确地输出输入的字符串,并且避免内存释放错误。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值