删除C编程中的所有结构条目

时间:2016-10-21 23:14:17

标签: c function structure

我无法将所有条目删除到已定义的结构中。以下是单个条目删除的功能代码以及我对“全部删除”功能的尝试

typedef struct person               //Structure Set up
{
    char fname[20];
    char lname[20];
    char number[20];
} person;

void delInfo(int num_entries,person*contacts)
{
    char delfirst[20];      //Setting up Arrays to match entry
    char dellast[20];
    printf("\n First Name: ");
    scanf("%s",delfirst);
    printf(" Last Name: ");
    scanf("%s",dellast);
    int i=0;
    for (i=0; i<num_entries; i++)       //Going through contacts
    {
        if (strcmp(delfirst,contacts[i].fname)==0 && strcmp(dellast,contacts[i].lname)==0)      //Testing for match between entry and contacts
        {
            for (i=i; i<num_entries-1; i++)         //Shifting every contact AFTER match down one
            {
                contacts[i]=contacts[i+1];
            }
            if(num_entries !=0)
                contacts=(person*)realloc(contacts,sizeof(person)*(num_entries-1)); //Freeing memory at end by way of realloc
            printf("\n %s %s deleted from contacts\n\n",delfirst,dellast);
            break;
        }
    }
    if(i == num_entries)
    {
        printf("\n Entry Not Found\n");
    }
    system("pause");
}

void deleteall(int num_entries,person*contacts)         //deleting all function
{
int i,j;
    for(i=0;i<num_entries;i++){
        contacts[i].fname=NULL;
    contacts[i].lname=NULL;
        contacts[i].number=NULL;
    }
free(contacts);

    printf("\n All contacts deleted\n\n");
    system("pause");
}

问题是它们是不兼容的类型(尝试从void分配给数组)。我可以使用某种循环并使用realloc将数组缩短为0吗?我不确定如何清除所有条目。

3 个答案:

答案 0 :(得分:1)

Stack<Integer> stack = new Stack<>(); for(int i=1;i<61;i++){ stack.add(i) } Collections.shuffle(stack); for(int i = 0; i < 3; i++){ for(int j = 0; j < 5; j++){ nums[i][j] = stack.pop(); } } 的成员大小固定,不与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

由于 char *tmp = realloc( contacts[i].fname, sizeof *contacts[i].fname * SIZE * 2 ); if ( tmp ) contacts[i].fname = tmp; 可能会返回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 ); 不会释放分配给pp->fnamep->lname的内存。

答案 1 :(得分:0)

您不必删除结构的三个字段,因为它们都被静态分配为每个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");
}

答案 2 :(得分:0)

您不能为contacts [i] .fname或contacts [i] .lname分配NULL,因为这些是数组,NULL是指针值。使用像memset()之类的东西,或者在释放之前不要对结构做任何事情。