释放结构成员指向的内存
Freeing memory pointed by members of a struct
在我的应用程序中实现它之前,我正在使用动态分配的结构数组和该结构的成员进行测试,但我并不真正熟悉这些(因此进行测试)并且我在释放时遇到错误每个结构的成员。
我没有正确释放吗?或者是我分配内存时的问题?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CODE_LEN 20
#define QTY_LEN 5
typedef struct {
char* code;
char* qty;
int filePos;
} ENTRY;
void malloc_ptr(ENTRY**);
void realloc_ptr(ENTRY**);
int main()
{
ENTRY *ssar;
int i;
malloc_ptr(&ssar);
memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);
printf("%s\n", ssar[0].code);
realloc_ptr(&ssar);
memcpy(ssar[4].code, "fghij", 5);
memset(ssar[4].code + 5, 0, 1);
printf("%s\n", ssar[4].code);
//Exited with code=3221226356 here
for(i = 0;i < 5;i ++){
free(ssar[i].code);
free(ssar[i].qty);
}
free(ssar);
return 0;
}
void realloc_ptr(ENTRY** ssar){
int i;
*ssar = realloc(*ssar, 5 * sizeof(*ssar));
for(i = 1;i < 5;i ++){
(*ssar)[i].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[i].qty = malloc(QTY_LEN * sizeof(char));
}
}
void malloc_ptr(ENTRY** ssar){
*ssar = malloc(sizeof(*ssar));
(*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));
}
谢谢
例如函数malloc_ptr
void malloc_ptr(ENTRY** ssar){
*ssar = malloc(sizeof(*ssar));
(*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));
}
不正确并调用未定义的行为。
在此声明中
*ssar = malloc(sizeof(*ssar));
您需要分配一个 ENTRY 类型的对象,而不是指向该类型对象的指针。那就是你需要写
*ssar = malloc( sizeof( **ssar ) );
或
*ssar = malloc( sizeof( ENTRY ) );
函数realloc_ptr
也存在同样的问题。而不是这个声明
*ssar = realloc(*ssar, 5 * sizeof(*ssar));
你必须写
*ssar = realloc(*ssar, 5 * sizeof(**ssar));
或
*ssar = realloc(*ssar, 5 * sizeof( ENTRY ));
另外最好使用中间指针,因为函数可以 return 空指针。在这种情况下,分配内存的先前地址将丢失。例如
ENTRY *tmp = realloc(*ssar, 5 * sizeof( ENTRY ));
if ( tmp != NULL ) *ssar = tmp;
而不是这两个语句
memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);
写起来更简单
strcpy( ssar[0].code, "abcde" );
在我的应用程序中实现它之前,我正在使用动态分配的结构数组和该结构的成员进行测试,但我并不真正熟悉这些(因此进行测试)并且我在释放时遇到错误每个结构的成员。
我没有正确释放吗?或者是我分配内存时的问题?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CODE_LEN 20
#define QTY_LEN 5
typedef struct {
char* code;
char* qty;
int filePos;
} ENTRY;
void malloc_ptr(ENTRY**);
void realloc_ptr(ENTRY**);
int main()
{
ENTRY *ssar;
int i;
malloc_ptr(&ssar);
memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);
printf("%s\n", ssar[0].code);
realloc_ptr(&ssar);
memcpy(ssar[4].code, "fghij", 5);
memset(ssar[4].code + 5, 0, 1);
printf("%s\n", ssar[4].code);
//Exited with code=3221226356 here
for(i = 0;i < 5;i ++){
free(ssar[i].code);
free(ssar[i].qty);
}
free(ssar);
return 0;
}
void realloc_ptr(ENTRY** ssar){
int i;
*ssar = realloc(*ssar, 5 * sizeof(*ssar));
for(i = 1;i < 5;i ++){
(*ssar)[i].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[i].qty = malloc(QTY_LEN * sizeof(char));
}
}
void malloc_ptr(ENTRY** ssar){
*ssar = malloc(sizeof(*ssar));
(*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));
}
谢谢
例如函数malloc_ptr
void malloc_ptr(ENTRY** ssar){
*ssar = malloc(sizeof(*ssar));
(*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));
}
不正确并调用未定义的行为。
在此声明中
*ssar = malloc(sizeof(*ssar));
您需要分配一个 ENTRY 类型的对象,而不是指向该类型对象的指针。那就是你需要写
*ssar = malloc( sizeof( **ssar ) );
或
*ssar = malloc( sizeof( ENTRY ) );
函数realloc_ptr
也存在同样的问题。而不是这个声明
*ssar = realloc(*ssar, 5 * sizeof(*ssar));
你必须写
*ssar = realloc(*ssar, 5 * sizeof(**ssar));
或
*ssar = realloc(*ssar, 5 * sizeof( ENTRY ));
另外最好使用中间指针,因为函数可以 return 空指针。在这种情况下,分配内存的先前地址将丢失。例如
ENTRY *tmp = realloc(*ssar, 5 * sizeof( ENTRY ));
if ( tmp != NULL ) *ssar = tmp;
而不是这两个语句
memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);
写起来更简单
strcpy( ssar[0].code, "abcde" );