C语言 代码给出堆缓冲区溢出错误消息

nlejzf6q  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(132)

这是我正在解决的LeetCode问题-
给定一个长度为n的整数数组nums,你想创建一个长度为2n的数组ans,其中ans[i] == nums[i]和ans[i + n] == nums[i],0〈= i〈n(0-索引)。
具体来说,ans是两个nums数组的连接。
示例:
输入:nums = [1,2,1]输出:[1,2,1,1,2,1]
这是我写的代码

int* getConcatenation(int* nums, int numsSize, int* returnSize){
    *returnSize = numsSize*2;
    int* ans = malloc(numsSize * 2 * sizeof(int));

    for(int i=0; i<numsSize*2; i++){
        ans[i] = nums[i];
        ans[i + numsSize] = nums[i];
    }

    return ans;
}

这是heap-buffer-overflow错误,我在这里做错了什么?PS:我是编程新手。截图附件ScreenShot
我尝试使用realloc()重新分配内存,但没有成功。

q3aa0525

q3aa05251#

很明显,由于for循环i<numsSize*2中的条件

for(int i=0; i<numsSize*2; i++){
    ans[i] = nums[i];
    ans[i + numsSize] = nums[i];
}

索引表达式ans[i + numsSize]中的i + numsSizenums[i]中的i提供了对两个阵列之外的存储器的访问,这导致未定义的行为。
如果使用标准的C函数memcpy,则该函数看起来足够简单。

#include <string.h>
#include <stdlib.h>

//...

int * getConcatenation( const int *nums, size_t numsSize, size_t *returnSize )
{
    int *ans = malloc( 2 * numsSize * sizeof( int ) );

    if ( ans != NULL )
    {
        memcpy( ans, nums, numsSize * sizeof( int ) );
        memcpy( ans + numsSize, nums, numsSize * sizeof( int ) );
    }

    *returnSize = ans == NULL ? 0 : 2 * numsSize;

    return ans;
}

如果你想使用for循环,那么函数可以看起来像下面这样

int * getConcatenation( const int *nums, size_t numsSize, size_t *returnSize )
{
    int *ans = malloc( 2 * numsSize * sizeof( int ) );

    if ( ans != NULL )
    {
        for ( size_t i = 0; i < numsSize; i++ )
        {
            ans[i] = nums[i];
            ans[i + numsSize] = nums[i];
        }       
    }

    *returnSize = ans == NULL ? 0 : 2 * numsSize;

    return ans;
}

相关问题