我无法将所有条目删除到已定义的结构中。以下是单个条目删除的功能代码以及我对“全部删除”功能的尝试
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吗?我不确定如何清除所有条目。
答案 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 );
不会释放分配给p
,p->fname
和p->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()之类的东西,或者在释放之前不要对结构做任何事情。