简单的名片管理 - 写入时出现访问冲突 [Visual Studio 2015]

Simple Business Card Administration - Access Violation When Writing [Visual Studio 2015]

我目前正在尝试编写一个简单的名片管理员程序(非常非常简单)。我有多种功能(添加卡,编辑卡,...)。 我目前完成了第一个函数 addCard 但是当我 运行 程序并调用该函数时,当我调用我的 addCard 函数的第一个 scanf 函数时出现错误(写入时访问冲突)。所以这是我的代码:

main.c:

#include "card.h"

int main() {

int action = 0;
int index = 1;
Card *card[50];
while (action != 5)
{
    action = menu(action);
    printf("Number: %i", action);
    switch (action) {
    case 1: addCard(*card, index); index++;  return 0;
    }
}
system("pause");
return 0;
}

card.h:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
int day;
int month;
int year;
}Date;

typedef struct
{
Date birthday;
char name[20];
char firstName[20];
char address[80];
char phonenumber[20];
 }Card;

int menu(int action);
void addCard(Card *acard, int aindex);

card.c:

#include "card.h"
#pragma warning(disable:4996)
#pragma warning(disable:4700)

int menu(int action) {

printf("Menu: \n");
printf("--------------------------------------------\n");
printf("1 -- Add Card\n");
printf("2 -- Edit/Update Card\n");
printf("3 -- Show Card\n");
printf("4 -- Delete Card\n");
printf("5 -- Exit\n");
printf("Action (1-4): \n");
printf("--------------------------------------------\n");
scanf(" %i", &action);
return action;
}

void addCard(Card *acard, int aindex) {

system("cls");
printf("Add new Card\n");
printf("Name: ");
scanf(" %s",  &acard[aindex].name);    //Access Violation when Writing Exception Error 
printf("First Name: ");
scanf(" %s", &acard[aindex].firstName);
printf("Adress: ");
scanf(" %s", &acard[aindex].address);
printf("Phone-Number: ");
scanf(" %s", &acard[aindex].phonenumber);
Date date;
printf("Date of birth: (dd-mm-yyyy): ");
scanf(" %i-%i-%i", &date.day, &date.month, &date.year);
acard[aindex].birthday = date;

}

问题出在您的 card 数组上。它是指向 Card 的(未初始化的)指针数组。然后,当您使用 *card 调用 addCard 时,这与使用 card[0] 调用它相同,这意味着您将未初始化的指针传递给 addCard 函数,该函数使用该指针作为大批。这会导致 未定义的行为 和不好的事情发生。

简单的解决方案?不要将 card 声明为指针数组,而是声明为结构数组。即

Card card[50];

然后将纯 card 传递给 addCard 函数(使用这样的数组会使它衰减为指向第一个元素 card == &card[0] 的指针)。

Card *card[50]; 是 50 个类型为 Card*.

的指针
Card  card[50];
addCard( &(card[0]), index);