c - 自由函数的动态内存问题。应用程序在堆缓冲区结束后写入内存
问题描述
#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 分配的动态内存,因为我在运行代码后遇到错误。错误:它说应用程序在堆缓冲区结束后写入内存。
函数将所需索引处的元素插入旧数组并返回新数组。
解决方案
我会用另一种方式来做。
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);
}
推荐阅读
- python-3.x - 使用 boto3 验证 AWS 凭证
- asp.net-mvc - 将枚举绑定到下拉列表
- php - Consolibyte PHP QuickBooks Desktop - 客户端找到响应内容
- python - 如何通过 Python 2.7 for 循环运行 numpy.unique 计数?
- c++ - 通过父类和偏移量访问成员变量
- javascript - 在 javascript 中添加具有不同来源的多个 iframe
- algorithm - 使用 O(k) 内存的 O(N) 运行时间的散列
- javascript - 检测二维空间中两个网格状物体的碰撞
- webpack - 三.js webpack的优势
- javascript - Javascript:在没有 JQuery 的选项卡列表中的类之间自定义切换