我正在做一个学校作业,驱动程序和头文件一起给我。我的工作是完成从文本文件中读取数据的功能,然后在其中搜索名称并返回电子邮件地址。使用指针和结构是一项巨大的练习。
程序读入名称和电子邮件地址的文本文件,然后使用malloc()
动态创建结构数组。 struct Card
由两个char指针构成,我使用strlen()
,malloc()
内存为该大小找到数据的长度,并将结构分配给给定的内存地址。
在打印完姓名和电子邮件并即将释放()内存之后,这一切似乎都工作正常。我每次都收到一个Aborted(核心转储)消息。不知道问题是什么。
我在printf()
之前放置了一个free()
来尝试找出问题的位置,但它似乎是在名称/电子邮件打印输出期间或刚发生之后发生的,因为我的永远不会执行printf()
之前一行的free()
个测试点。
我假设驱动程序没问题,而且它与我的功能有关。 有人想偷偷刺痛吗?
//Main
#include <stdio.h>
#include <stdlib.h>
#include "lab9utils.h"
int main(int argc, char * argv[]) {
// Variable declarations.
struct Card * cards;
int size;
int k;
char * email;
// Make sure we have 2 extra command-line paramgers.
if (argc < 3) {
printf("Usage: ./lab9.exe <data_filename> <name_to_lookup>");
return 0;
}
// Get the cards and do the lookup.
cards = getCards(argv[1], &size);
email = lookup(cards, argv[2], size);
// Display the output message ("sorry!" or "name -> email").
if (email == NULL) {
printf("Sorry, that name was not in the list of cards.\n");
} else {
printf("%s -> %s\n", argv[2], email);
}
// Free the memory used by the structures.
k = 0;
printf("Test Point#1");
for (k = 0; k < size; k++) {
free(cards[k].name);
free(cards[k].email);
}
printf("Test Point#2");
free(cards);
return 0;
}
// Header
#ifndef LAB9UTILS_H
#define LAB9UTILS_H
struct Card {
char * name;
char * email;
};
struct Card * getCards(char * filename, int * size);
char * lookup(struct Card * cards, char * name, int size);
#endif
// Functions
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lab9utils.h"
struct Card * getCards(char * filename, int * size_return) {
int i,size;
char cTempName[51]={0};
char cTempEmail[51]={0};
size = 0;
// I/O Setup
FILE *fp;
fp = fopen(filename,"r");
// error checking
if(fp == NULL)
{
perror("Error in opening file");
return(NULL);
}
// Input Loop
while(!feof(fp))
{
fscanf(fp,"%s%s",cTempName,cTempEmail);
size++;
}
size=size-1;
fclose(fp);
struct Card * card = (struct Card *)malloc(*size_return * sizeof(struct Card));
fp = fopen( filename ,"r");
// error checking
if(fp == NULL)
{
perror("Error in opening file");
return(NULL);
}
for(i=0;i<size;i++)
{
fscanf(fp,"%s%s",cTempName,cTempEmail);
card[i].name=(char *)malloc((strlen(cTempName)+1));
card[i].email=(char *)malloc((strlen(cTempEmail)+1));
strcpy(card[i].name,cTempName);
strcpy(card[i].email,cTempEmail);
}
fclose(fp);
// loop to confirm data was read
for(i=0;i<size;i++)
{
printf("[ %d ] Name:%s email:%s Total size:%d\n",i,card[i].name,card[i].email,size);
}
*size_return = size;
return card;
}
char * lookup(struct Card * cards, char * name, int size) {
int i;
for(i=0;i<size;i++)
{
if (strcmp(cards[i].name,name)==0)
{
return cards[i].email;
}
}
return NULL;
}
答案 0 :(得分:1)
*size_return
的值是垃圾,因为您只在函数末尾将其设置为size
。
改变这个:
struct Card * card = (struct Card *)malloc(*size_return * sizeof(struct Card));
对此:
struct Card * card = (struct Card *)malloc(size * sizeof(struct Card));