执行出错,但是编译器上可以正常执行

int minnum(int a, int b) {
    if (a > b)
        return b;
    else
        return a;
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int nums1_haxi[1001] = { 0 };
    int nums2_haxi[1001] = { 0 };
    int flag = 1;
    int *p=NULL,j=0;
    int tmp;
    for (int i1 = 0; i1 < nums1Size; i1++) {
        nums1_haxi[nums1[i1]]++;
    }
    for (int i2 = 0; i2 < nums2Size; i2++) {
        nums2_haxi[nums2[i2]]++;
    }
    for (int i = 0; i < 1001; i++) {
        if ((nums1_haxi[i] > 0 && nums2_haxi[i] > 0)) {
            if (flag) {
                p = malloc(sizeof(int));
                tmp= i;
                p[j] = tmp;
                j++;
                for (int k = 1; k < minnum(nums1_haxi[i], nums2_haxi[i]); k++) {
                    if(p!=NULL)
                    realloc(p, sizeof(int) * (j + 1));
                    tmp = i;
                    p[j] = tmp;
                    j++;
                }
                flag = 0;
            }
            else {
                for (int k = 0; k < minnum(nums1_haxi[i], nums2_haxi[i]); k++) {
                    if(p!=NULL)
                    realloc(p, sizeof(int) * (j + 1));
                    tmp=i;
                    p[j] = tmp;
                    j++;
                }
            }
        }
    }
    *returnSize = j;
    return p;
}

img

如果p指向的内存后没有足够的连续空间时,realloc就会将原有p指向的内存数据从头到尾拷贝到新分配的内存区域,而后释放原来p所指内存区域,而返回一个新地址。
所以你上面不用新地址接受realloc而直接用原p,可能面临原来的p已经被释放掉的风险,后面的访问就会越界报错。


这段代码实现了两个数组的交集查找,并将结果存储在一个动态分配的整数数组中。

  具体来说,代码首先使用两个哈希表分别记录两个数组中出现的数字及其出现次数。然后,它遍历哈希表,将两个数组都包含的数字加入到结果数组中。由于结果数组大小不确定,代码使用动态内存分配实现数组的动态增长。最后,将结果数组的大小存储在returnSize指针指向的位置,并返回结果数组的指针。

  需要注意的是,代码在使用realloc函数重新分配结果数组的内存时,并没有对realloc函数的返回值进行判断和处理,可能会导致内存泄漏和程序崩溃。建议在使用realloc函数时加入相应的判断和错误处理代码。

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢