首页 > 解决方案 > 自由函数的动态内存问题。应用程序在堆缓冲区结束后写入内存

问题描述

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

int* insert(int* array, int length, int index, int value)
{
    // Assigning Dynamic memory depends on length of array
    int* newArray = (int*)malloc((length * sizeof(int) + 1));
    // Check if the memory has been successfully allocated by malloc or not
    if (newArray == NULL)
    {
        printf("Memory not allocated.\n");
        exit(0);
    }
    // Copying old array elements into new array before index
    for (int i = 0; i < index; i++)
    {
        newArray[i] = array[i];
    }
    // Placing new value into Array
    newArray[index] = value;
    // Copying old array elements into new array after index
    for (int i = index; i < length; i++)
    {
        newArray[i + 1] = array[i];
    }
    // Return new array elements
    return newArray;
}

int main()
{
    int p[] = { 1,2,3,4,5 };
    int len = sizeof(p) / sizeof(p[0]);
    int* result = insert(p, len, 5, 99);
    for (int i = 0; i < (len + 1); i++)
    {
        printf("Element %d: %d \n", i, result[i]);
    }
    free(result);
    return 0;
}

问题是我应该在哪里释放 Malloc 分配的动态内存,因为我在运行代码后遇到错误。错误:它说应用程序在堆缓冲区结束后写入内存。

函数将所需索引处的元素插入旧数组并返回新数组。

标签: cdynamic-memory-allocation

解决方案


我会用另一种方式来做。

typedef struct
{
    size_t size;
    int array[];
}INT_VECTOR_t;

INT_VECTOR_t *insert(INT_VECTOR_t *vector, int *array, size_t arraySize)
{
    size_t pos = vector ? vector -> size : 0;
    size_t newsize = vector ? vector -> size + arraySize : arraySize;

    vector = realloc(vector, sizeof(*vector) + sizeof(vector -> array[0]) * newsize);
    if(vector)
    {
        memcpy(&vector -> array[pos], array, arraySize * sizeof(vector -> array[0]));
        vector -> size = newsize;
    }

    return vector;
}

void print_vector(INT_VECTOR_t *vector)
{
    if(vector)
    {
        printf("Vector size = %zu\n", vector -> size);
        for(size_t index = 0; index < vector -> size; index ++)
        {
            printf("vevtor[%zu] = %d\n", index, vector -> array[index]);
        }
    }
}

#define SZ(a) (sizeof(a)/sizeof((a)[0]))


int main(void)
{
    INT_VECTOR_t *vect = NULL, *tmp;

    int array1[] = {0,1,2,3,4,5};
    int array2[] = {6,7,8};
    int array3[] = {9,10,11,12};

    tmp = insert(vect, array1, SZ(array1));
    if(tmp) vect = tmp;  // same as realloc
    print_vector(vect);

    tmp = insert(vect, array2, SZ(array2));
    if(tmp) vect = tmp;  // same as realloc
    print_vector(vect);

    tmp = insert(vect, array3, SZ(array3));
    if(tmp) vect = tmp;  // same as realloc
    print_vector(vect);
}

https://godbolt.org/z/oserPh


推荐阅读