删除C编程中的所有结构项

删除C编程中的所有结构项,c,function,structure,C,Function,Structure,我在删除定义结构中的所有条目时遇到问题。下面是删除单个条目的功能代码,以及我尝试的“全部删除”功能 typedef struct person//结构设置 { char-fname[20]; 字符名称[20]; 字符数[20]; }人; void delInfo(int num_条目,个人*联系人) { char delfirst[20];//设置数组以匹配条目 char dellast[20]; printf(“\n名字:”); scanf(“%s”,delfirst); printf(“姓氏

我在删除定义结构中的所有条目时遇到问题。下面是删除单个条目的功能代码,以及我尝试的“全部删除”功能

typedef struct person//结构设置
{
char-fname[20];
字符名称[20];
字符数[20];
}人;
void delInfo(int num_条目,个人*联系人)
{
char delfirst[20];//设置数组以匹配条目
char dellast[20];
printf(“\n名字:”);
scanf(“%s”,delfirst);
printf(“姓氏:”);
scanf(“%s”,dellast);
int i=0;

对于(i=0;i您不必删除结构的三个字段,因为它们都是静态分配给每个20字节的。如果使用malloc动态分配,您只需要释放三个字段中的内存

不过,您必须释放所有动态分配的联系人

void deleteall(int num_entries,person*contacts)         //deleting all function
{
    for(int i=0;i<num_entries;i++){
        free(contacts++)
    }

    printf("\n All contacts deleted\n\n");
    system("pause");
}
void deleteall(int num_条目,person*contacts)//删除所有函数
{

对于(int i=0;i您不能将NULL分配给联系人[i].fname或联系人[i].lname,因为它们是数组,NULL是指针值。或者使用类似于memset()的方法或者在释放之前不要对结构做任何事情。

struct person
的成员大小是固定的,不会与
struct
实例分开分配-简而言之,您不能调整数组的大小,也不能在不释放整个
struct
实例的情况下释放其存储。在这种情况下,您最好向每个成员写入一个空字符串,以指示它未被使用:

strcpy( contacts[i].fname, "" );
不过,这不会改变数组的大小

为了使
struct-person
的成员可以调整大小和/或删除,您必须将它们与
struct
实例本身分开分配。为此,您需要将它们声明为指向
char
的指针,而不是
char
的数组:

struct person
{
  char *fname;
  char *lname;
  char *number;
};
创建
struct person
的新实例时,需要分别为每个成员分配内存:

#define SIZE 20  // for this example, both number of contacts and size
                 // of each struct member

struct person contacts[size];
for ( size_t i = 0; i < j; i++ )
{
  contacts[i].fname = malloc( sizeof *contacts[i].fname * SIZE );
  contacts[i].lname = malloc( sizeof *contacts[i].lname * SIZE );
  contacts[i].number= malloc( sizeof *contacts[i].number * SIZE );
}
由于
realloc
可能会返回
NULL
,因此建议您将结果保存到临时指针变量,而不是立即将其重新分配回原始指针;否则可能会丢失先前分配的内存,导致内存泄漏

您还需要跟踪为每个成员分配了多少内存,以防止缓冲区溢出

要删除任何成员,请使用
free

free( contacts[i].fname );
请注意,如果动态分配
struct person
的实例,则仍然需要动态分配每个成员:

struct person *p = malloc( sizeof *p );
p->fname = malloc( sizeof *p->fname * SIZE );
...
这还意味着您必须先解除分配每个成员,然后再解除分配结构实例本身:

free( p->fname );
free( p->lname );
free( p->number );
free( p );

简单地释放
p
不会释放分配给
p->fname
p->lname
、和
p->number

的内存。这会为参数1产生[Error]不兼容的类型,即“free”和[Note]预期的“void*”,但当我尝试运行该函数时,该参数的类型为“person”,它现在“停止工作”并返回一个大数字您需要提供更多信息。是否存在分段错误?在调用此函数之前如何分配联系人?他们是在连续内存中还是在spuratic中?@SimonBlack you cannot free()联系人数组的单个元素,因为整个数组可能是由malloc或calloc分配的。它不是指针数组。@SimonBlack person*contacts;int num_entries=0;contacts=NULL;您能详细说明为什么我必须使用指向
char
的指针而不是
char
的数组来解除分配/删除吗?@NL这里:因为我们使用
malloc
动态分配内存,它总是返回一个指针值。
struct person *p = malloc( sizeof *p );
p->fname = malloc( sizeof *p->fname * SIZE );
...
free( p->fname );
free( p->lname );
free( p->number );
free( p );