【leetcode】AddressSanitizer: heap-buffer-overflow on address所引出的问题思考[1528.重新排列字符串]

本文通过一道LeetCode题目,详细解析了堆内存溢出的原因及解决方案。重点在于字符串末尾添加'',避免越界访问,提供正确代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在leetcode上写题,当写到第1528题时突然出现
在这里插入图片描述
也就是堆内存溢出heap-buffer-overflow on address可是在自己的vscode上却没有一点问题。

1528. 重新排列字符串

题目
给你一个字符串 s 和一个 长度相同 的整数数组 indices 。

请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。

返回重新排列后的字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shuffle-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我们来看代码:
这是错误代码:

char* restoreString(char * s, int* indices, int indicesSize)
{
    char* res;
    res = (char*)malloc(sizeof(char)*(indicesSize));
    for(int i=0;i<indicesSize;i++)
    {
        res[indices[i]] = s[i];
    }
    return res;
}

经过参考题解,我发现堆溢出的原因是没有在字符串末尾加上'\0'导致了问题的出现!!
正解:

char* restoreString(char * s, int* indices, int indicesSize)
{
    char* res;
    res = (char*)malloc(sizeof(char)*(indicesSize+1));
    for(int i=0;i<indicesSize;i++)
    {
        res[indices[i]] = s[i];
    }
    res[indicesSize] = '\0';
    return res;


}

首先在malloc时就要多申请一块内存,之后再在字符串末尾添加'\0'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值