简单的名片管理 - 写入时出现访问冲突 [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);
我目前正在尝试编写一个简单的名片管理员程序(非常非常简单)。我有多种功能(添加卡,编辑卡,...)。 我目前完成了第一个函数 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);