在 realloc 中双重释放或损坏(out)
double free or corruption (out) in realloc
几天以来,我一直在尝试解决我的代码中的一个问题,但我仍然坚持不懈。
我想通过 realloc 在选项卡中插入一个值,但我有内存泄漏(或其他原因),我不知道为什么。
这是我的代码:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct struct_vector{
int nbElement;
double* element;
}s_vector;
typedef s_vector* p_s_vector;
p_s_vector vector_alloc(size_t n){
p_s_vector vect =(p_s_vector) malloc(sizeof(p_s_vector));
vect->nbElement = n;
vect->element = (double*) malloc(sizeof(double) * n);
for(int i=0; i<n; i++){
vect->element[i] = i;
}
return vect;
}
void vector_free(p_s_vector p_vector){
free(p_vector->element);
free(p_vector);
p_vector = NULL;
}
void vector_insert(p_s_vector p_vector, size_t i, double v){
if(i < 0 || i > p_vector->nbElement)
exit(0);
else{
p_s_vector temp = vector_alloc(p_vector->nbElement);
for(int k=0; k < temp->nbElement; k++)
temp->element[k] = p_vector->element[k];
p_vector->element = (double*)realloc(p_vector->element,sizeof(double)*(p_vector->nbElement++));
for(int k=0; k<i; k++)
p_vector->element[k] = temp->element[k];
p_vector->element[i] = v;
for(int k=i+1; k<p_vector->nbElement; k++)
p_vector->element[k] = temp->element[k-1];
vector_free(temp);
}
}
int main(){
p_s_vector vect = vector_alloc(3);
vector_insert(vect, 1, 11);
for(int i=0; i<vect->nbElement; i++){
printf("%.1f\n",vect->element[i]);
}
vector_free(vect);
return 0;
}
当我 运行 我的程序时,出现双重释放或损坏 (out) 错误。
使用 Valgrind 命令,我有很多“地址 0x4a4d048 在分配大小为 8 的块后为 0 字节”,我不明白为什么
如果有人能帮助我,那就太好了。
谢谢。
而不是
p_s_vector vect =(p_s_vector) malloc(sizeof(p_s_vector));
你必须写
p_s_vector vect =(p_s_vector) malloc(sizeof( *p_s_vector ));
或
p_s_vector vect =(p_s_vector) malloc(sizeof( s_vector ));
也在这个声明中
p_vector->element = (double*)realloc(p_vector->element,sizeof(double)*(p_vector->nbElement++));
您需要使用 pre-increment 运算符
而不是 post-increment 运算符
p_vector->element = (double*)realloc(p_vector->element,sizeof(double)*(++p_vector->nbElement));
您的代码中有两个错误。行
p_s_vector vect = (p_s_vector) malloc(sizeof(p_s_vector));
应该是
p_s_vector vect = malloc(sizeof(s_vector));
因为您想分配一个结构而不是指向它的指针(并且不要转换 malloc 的 return 值)。您还应该 pre-increment 重新分配中的计数,所以
p_vector->element = (double *)realloc(p_vector->element, sizeof(double) * (p_vector->nbElement++));
应该是
p_vector->element = realloc(p_vector->element, sizeof(double) * (++p_vector->nbElement));
最好不要在表达式中使用 side-effects,因此我建议在单独的语句中增加计数。
为了简化内存分配并使它们更不容易出错,我建议像这样定义宏函数:
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NEW_ARRAY(pointer, length) \
{ \
(pointer) = malloc(((size_t) length) * sizeof (pointer)[0]); \
if ((pointer) == NULL) { \
fprintf(stderr, "Allocating %lu bytes of memory with malloc failed: %s\n", ((long unsigned int) length) * sizeof (pointer)[0], strerror(errno)); \
exit(EXIT_FAILURE); \
} \
}
#define RENEW_ARRAY(pointer, length) \
{ \
(pointer) = realloc((pointer), ((size_t) length) * sizeof (pointer)[0]); \
if ((pointer) == NULL) { \
fprintf(stderr, "Allocating %lu bytes of memory with realloc failed: %s\n", ((long unsigned int) length) * sizeof (pointer)[0], strerror(errno)); \
exit(EXIT_FAILURE); \
} \
}
#define NEW(pointer) NEW_ARRAY((pointer), 1)
typedef struct struct_vector {
int nbElement;
double *element;
} s_vector;
typedef s_vector *p_s_vector;
p_s_vector vector_alloc(size_t n)
{
p_s_vector vect;
NEW(vect);
vect->nbElement = n;
NEW_ARRAY(vect->element, n);
for (int i = 0; i < n; i++) {
vect->element[i] = i;
}
return vect;
}
void vector_free(p_s_vector p_vector)
{
free(p_vector->element);
free(p_vector);
p_vector = NULL;
}
void vector_insert(p_s_vector p_vector, size_t i, double v)
{
if (i < 0 || i > p_vector->nbElement) {
exit(0);
} else {
p_s_vector temp = vector_alloc(p_vector->nbElement);
for (int k = 0; k < temp->nbElement; k++) {
temp->element[k] = p_vector->element[k];
}
p_vector->nbElement++;
RENEW_ARRAY(p_vector->element, p_vector->nbElement);
for (int k = 0; k < i; k++) {
p_vector->element[k] = temp->element[k];
}
p_vector->element[i] = v;
for (int k = i + 1; k < p_vector->nbElement; k++) {
p_vector->element[k] = temp->element[k - 1];
}
vector_free(temp);
}
}
int main()
{
p_s_vector vect = vector_alloc(3);
vector_insert(vect, 1, 11);
for (int i = 0; i < vect->nbElement; i++) {
printf("%.1f\n", vect->element[i]);
}
vector_free(vect);
return 0;
}
最后,如果您删除“p”和“s”前缀,您的代码会变得不那么嘈杂;我会简单地将矢量数据类型定义为
struct VectorDesc {
int nbElement;
double *element;
};
typedef struct VectorDesc *Vector;
几天以来,我一直在尝试解决我的代码中的一个问题,但我仍然坚持不懈。 我想通过 realloc 在选项卡中插入一个值,但我有内存泄漏(或其他原因),我不知道为什么。
这是我的代码:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct struct_vector{
int nbElement;
double* element;
}s_vector;
typedef s_vector* p_s_vector;
p_s_vector vector_alloc(size_t n){
p_s_vector vect =(p_s_vector) malloc(sizeof(p_s_vector));
vect->nbElement = n;
vect->element = (double*) malloc(sizeof(double) * n);
for(int i=0; i<n; i++){
vect->element[i] = i;
}
return vect;
}
void vector_free(p_s_vector p_vector){
free(p_vector->element);
free(p_vector);
p_vector = NULL;
}
void vector_insert(p_s_vector p_vector, size_t i, double v){
if(i < 0 || i > p_vector->nbElement)
exit(0);
else{
p_s_vector temp = vector_alloc(p_vector->nbElement);
for(int k=0; k < temp->nbElement; k++)
temp->element[k] = p_vector->element[k];
p_vector->element = (double*)realloc(p_vector->element,sizeof(double)*(p_vector->nbElement++));
for(int k=0; k<i; k++)
p_vector->element[k] = temp->element[k];
p_vector->element[i] = v;
for(int k=i+1; k<p_vector->nbElement; k++)
p_vector->element[k] = temp->element[k-1];
vector_free(temp);
}
}
int main(){
p_s_vector vect = vector_alloc(3);
vector_insert(vect, 1, 11);
for(int i=0; i<vect->nbElement; i++){
printf("%.1f\n",vect->element[i]);
}
vector_free(vect);
return 0;
}
当我 运行 我的程序时,出现双重释放或损坏 (out) 错误。 使用 Valgrind 命令,我有很多“地址 0x4a4d048 在分配大小为 8 的块后为 0 字节”,我不明白为什么
如果有人能帮助我,那就太好了。 谢谢。
而不是
p_s_vector vect =(p_s_vector) malloc(sizeof(p_s_vector));
你必须写
p_s_vector vect =(p_s_vector) malloc(sizeof( *p_s_vector ));
或
p_s_vector vect =(p_s_vector) malloc(sizeof( s_vector ));
也在这个声明中
p_vector->element = (double*)realloc(p_vector->element,sizeof(double)*(p_vector->nbElement++));
您需要使用 pre-increment 运算符
而不是 post-increment 运算符p_vector->element = (double*)realloc(p_vector->element,sizeof(double)*(++p_vector->nbElement));
您的代码中有两个错误。行
p_s_vector vect = (p_s_vector) malloc(sizeof(p_s_vector));
应该是
p_s_vector vect = malloc(sizeof(s_vector));
因为您想分配一个结构而不是指向它的指针(并且不要转换 malloc 的 return 值)。您还应该 pre-increment 重新分配中的计数,所以
p_vector->element = (double *)realloc(p_vector->element, sizeof(double) * (p_vector->nbElement++));
应该是
p_vector->element = realloc(p_vector->element, sizeof(double) * (++p_vector->nbElement));
最好不要在表达式中使用 side-effects,因此我建议在单独的语句中增加计数。
为了简化内存分配并使它们更不容易出错,我建议像这样定义宏函数:
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NEW_ARRAY(pointer, length) \
{ \
(pointer) = malloc(((size_t) length) * sizeof (pointer)[0]); \
if ((pointer) == NULL) { \
fprintf(stderr, "Allocating %lu bytes of memory with malloc failed: %s\n", ((long unsigned int) length) * sizeof (pointer)[0], strerror(errno)); \
exit(EXIT_FAILURE); \
} \
}
#define RENEW_ARRAY(pointer, length) \
{ \
(pointer) = realloc((pointer), ((size_t) length) * sizeof (pointer)[0]); \
if ((pointer) == NULL) { \
fprintf(stderr, "Allocating %lu bytes of memory with realloc failed: %s\n", ((long unsigned int) length) * sizeof (pointer)[0], strerror(errno)); \
exit(EXIT_FAILURE); \
} \
}
#define NEW(pointer) NEW_ARRAY((pointer), 1)
typedef struct struct_vector {
int nbElement;
double *element;
} s_vector;
typedef s_vector *p_s_vector;
p_s_vector vector_alloc(size_t n)
{
p_s_vector vect;
NEW(vect);
vect->nbElement = n;
NEW_ARRAY(vect->element, n);
for (int i = 0; i < n; i++) {
vect->element[i] = i;
}
return vect;
}
void vector_free(p_s_vector p_vector)
{
free(p_vector->element);
free(p_vector);
p_vector = NULL;
}
void vector_insert(p_s_vector p_vector, size_t i, double v)
{
if (i < 0 || i > p_vector->nbElement) {
exit(0);
} else {
p_s_vector temp = vector_alloc(p_vector->nbElement);
for (int k = 0; k < temp->nbElement; k++) {
temp->element[k] = p_vector->element[k];
}
p_vector->nbElement++;
RENEW_ARRAY(p_vector->element, p_vector->nbElement);
for (int k = 0; k < i; k++) {
p_vector->element[k] = temp->element[k];
}
p_vector->element[i] = v;
for (int k = i + 1; k < p_vector->nbElement; k++) {
p_vector->element[k] = temp->element[k - 1];
}
vector_free(temp);
}
}
int main()
{
p_s_vector vect = vector_alloc(3);
vector_insert(vect, 1, 11);
for (int i = 0; i < vect->nbElement; i++) {
printf("%.1f\n", vect->element[i]);
}
vector_free(vect);
return 0;
}
最后,如果您删除“p”和“s”前缀,您的代码会变得不那么嘈杂;我会简单地将矢量数据类型定义为
struct VectorDesc {
int nbElement;
double *element;
};
typedef struct VectorDesc *Vector;