|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
今天在学习数据结构的过程中,发现了一个问题
如果我定义了一个结构体,在main函数中再声明一个结构体指针变量p
将p直接在子函数中给各元素赋值,编译器警告我的指针p没有初始化
如果我让struct Book *p = NULL,再次运行程序,编译器没有警告了,但是程序没有任何输出
到最后如果我使用malloc函数进行内存分配,程序运行正常。
由上所述,我遇到的问题就是在主函数中声明的结构体指针,如果没有进行内存分配,程序就无法正常运行,哪怕给结构体指针赋值NULL也不行。
但是,在我之前学习结构体时写的另一个程序中,我也是在主函数中声明了一个结构体指针,只是给他赋值了NULL,程序却正常运行了。
综上,上述两者很矛盾,一个结构体指针只需要赋值null程序就能够正常运行,另一个结构体指针却必须分配内存空间才能正常运行。
我有问题的代码如下:- #include <stdio.h>
- #include <stdlib.h>
- struct Book{
- int arrays[10];
- int lens;
- };
- void InitLists(struct Book *t);
- void InitLists(struct Book *t){
- for (int i = 0; i < 10;i++){
- t->arrays[i] = 0;
- }
-
- t->lens = 0;
- }
- int main(){
- struct Book *p = NULL; //如果只是赋值,程序无法运行
- // p = (struct Book *)malloc(sizeof(struct Book)); //将这一行取消注释以后,程序正常运行
- InitLists(p);
- for (int i = 0; i < 10;i++){
- printf("%d = %d\n", i, p->arrays[i]);
- }
- return 0;
- }
复制代码
下面的代码是我以前写的一个程序,代码很长,只需要关注main函数的前几行,我没有进行内存分配,程序仍然正常运行
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- struct Lists
- {
- char name[128];
- char num[20];
- struct Lists *next;
- };
- void addPerson(struct Lists **head);
- void findPerson();
- void changePerson();
- void delPerson();
- void displayContacts();
- void endPerson();
- int welcome();
- int welcome(){
- int num;
- printf("欢迎使用通讯录管理程序!\n");
- printf("1.插入新的联系人\n2.查找已有的联系人\n3.更改已有的联系人\n\
- 4.删除已有的联系人\n5.显示当前通讯录\n6.退出通讯录程序\n");
- printf("请输入数字选择需要的服务:");
- scanf("%d", &num);
- getchar();
- return num;
- }
- void addPerson(struct Lists **head){
- struct Lists *temp;
- temp = (struct Lists *)malloc(sizeof(struct Lists));
- static struct Lists *prior=NULL;
- // struct Lists *current=NULL;
- static struct Lists *tail = NULL;
- printf("您已选择插入新的联系人!\n");
- printf("请输入联系人姓名:");
- scanf("%s", temp->name);
- printf("请输入联系人电话:");
- scanf("%s", temp->num);
- if(prior == NULL){
- tail = temp;
- prior = tail;
- temp->next = NULL;
- *head = temp;
- }
- else{
- prior = tail;
- tail->next = temp;
- temp->next = NULL;
- // (*head)->next =
- }
- printf("添加联系人成功!\n");
- }
- void findPerson(struct Lists **head){
- struct Lists *temp;
- temp = (struct Lists *)malloc(sizeof(struct Lists));
- temp = *head;
- printf("您已选择查找已有联系人!\n");
- int ch;
- printf("您是想根据姓名(1)查找还是根据号码(2)查找:");
- scanf("%d", &ch);
- switch (ch)
- {
- case 1:
- printf("您已选择根据姓名查找!请输入姓名:");
- char name[128];
- scanf("%s", name);
- while(temp != NULL && strcmp(temp->name,name)){
-
- temp = temp->next;
- }
- if(temp == NULL){
- printf("没有找到符合的条件!\n");
- }
- else{
- printf("找到适合的条件!\n");
- printf("姓名:%s", temp->name);
- printf("号码:%s", temp->num);
- }
- break;
- case 2:
- printf("您已选择根据号码查找!请输入号码:");
- char num[20];
- scanf("%s", num);
- while(temp != NULL && strcmp(temp->num,num)){
- temp = temp->next;
- }
- if(temp == NULL){
- printf("没有找到符合的条件!\n");
- }
- else{
- printf("找到适合的条件!\n");
- printf("姓名:%s", temp->name);
- printf("号码:%s", temp->num);
- }
- break;
- default:
- printf("请输入正确的选项!");
- break;
- }
- }
- void changePerson(struct Lists **head){
- struct Lists *temp;
- temp = (struct Lists *)malloc(sizeof(struct Lists));
- temp = *head;
- printf("您选择了更改已有联系人!");
- printf("请输入您要更改的联系人姓名:");
- char name[128];
- scanf("%s", name);
- while(temp != NULL && strcmp(temp->name,name)){
- temp = temp->next;
- }
- if(temp == NULL){
- printf("没有找到符合更改的名字!\n");
- }
- else{
- printf("找到可以更改的联系人!\n");
- printf("姓名:%s\n", temp->name);
- printf("号码:%s\n", temp->num);
- printf("您要更改姓名[1]还是号码[2]?");
- int ch;
- scanf("%d", &ch);
- switch (ch)
- {
- case 1:
- printf("请输入更改后的姓名:");
- scanf("%s", temp->name);
- break;
- case 2:
- printf("请输入更改后的号码:");
- scanf("%s", temp->num);
- break;
- default:
- printf("请输入正确的数字!");
- break;
- }
- }
- }
- void delPerson(struct Lists **head){
- printf("您选择了删除已有联系人\n");
- printf("请输入您想要删除的联系人姓名:");
- struct Lists *temp;
- struct Lists *prior = NULL;
- temp = (struct Lists *)malloc(sizeof(struct Lists));
- temp = *head;
- char name[128];
- scanf("%s", name);
- while(temp != NULL && strcmp(temp->name,name)){
- prior = temp;
- temp = temp->next;
- }
- if(temp == NULL){
- printf("没有找到符合删除的名字!\n");
- }
- else{
- printf("找到可以删除的联系人!\n");
- printf("姓名:%s\n", temp->name);
- printf("号码:%s\n", temp->num);
- printf("确认删除吗?[1][0]");
- int ch;
- scanf("%d", &ch);
- switch (ch)
- {
- case 1:
- if(prior == NULL){
- *head = (*head)->next;
- }
- else{
- prior->next = temp->next;
- };
- // printf("@@@@@@@@@@@@@@@@%p\n", temp->next);
- printf("已删除!");
- break;
- case 2:
- printf("取消成功!");
- break;
- default:
- printf("请输入正确的指令!");
- break;
- }
- }
- }
- void displayContacts(struct Lists **head){
- printf("以下为已存储的联系人信息:\n");
- struct Lists *temp;
- temp = (struct Lists *)malloc(sizeof(struct Lists));
- temp = *head;
- while(temp != NULL){
- printf("========================================\n");
- printf("姓名:%s\n", temp->name);
- printf("号码:%s\n", temp->num);
- temp = temp->next;
- }
- }
- void endPerson(struct Lists **head){
- printf("准备退出通讯录程序...\n");
- _sleep(1000);
- printf("开始释放内存...\n");
- free(*head);
- printf("内存释放完毕...\n再见!");
- exit(1);
- }
- int main(void){
- int choice;
- struct Lists *head = NULL;
- while(1){
- choice = welcome();
- switch (choice)
- {
- case 1:
- addPerson(&head);
- break;
- case 2:
- findPerson(&head);
- break;
- case 3:
- changePerson(&head);
- break;
- case 4:
- delPerson(&head);
- break;
- case 5:
- displayContacts(&head);
- break;
- case 6:
- endPerson(&head);
- break;
- default:
- printf("输入错误!请重新输入!");
- }
- }
- }
复制代码
本帖最后由 jhq999 于 2021-11-30 06:25 编辑
- temp = (struct Lists *)malloc(sizeof(struct Lists));//下面函数里
复制代码
上面的却没有申请内存空间,运行出错
|
|