我正在尝试为此项目使用动态内存。我得到一个段错误,但我无法弄清楚我做错了什么。谁能指出我的错误在哪里?该文件似乎正确读取...但我假设错误是一个流氓指针..帮助!
我只是想从一个文件中读出“heart two 2”到“spade ace 11”,所有单词都被一个空格隔开。我的程序在使用动态内存之前工作了..
#include <iostream>
#include <fstream>
#include <ctime>
#include <stdlib.h>
#include <string>
using namespace std;
//global constant(s)
const int maxCards = 52;
//Structs
struct card
{
char *suit;
char *rank;
int cvalue;
char location;
};
void readDeck(card* deckPtr);
void cardsInit(char *finNameP,card *deckPtr);
//program
int main()
{
card *deckPtr = new card[52];
char *finNameP = new char[13];
strcopy(finNameP,"cardFile.txt");
cardsInit(finNameP,deckPtr); // function i wrote that works
readDeck(deckPtr); //simply reads the deck from &deckPtr[0] -> &deck[51]
delete [] finNameP;
}
void cardsInit(char *finNameP, card *deckPtr)
{
//set up card file to be read in
ifstream fin;
cout << "Please enter file name...(cardFile.txt)" << endl;;
cin >> *finNameP;
fin.open(finNameP);
//create pointer and set initial value
card *deckHome = deckPtr;
for(int i=0;i<52;i++)
{
(*deckPtr).suit = new char[9];
(*deckPtr).rank = new char[9];
deckPtr++;
}
deckPtr = deckHome;
//check if cardFile.txt opens correctly
if(!fin.good())
{
cout << "Error with card file" << endl;
}
else
{
while(fin.good())
{
for(deckPtr = &deckPtr[0]; deckPtr < &deckPtr[maxCards];deckPtr++)
{
fin >> (*deckPtr).suit;
fin >> (*deckPtr).rank;
fin >> (*deckPtr).cvalue;
}
}
}
fin.close();
delete []finNameP;
delete [] (*deckPtr).suit;
delete [] (*deckPtr).rank;
}
答案 0 :(得分:2)
这是一种非常古老的编程方式。不使用new
,而是使用std::string
或std::vector<char>
。那些也使用动态内存,但它们使你更难以意外地导致内存分配错误。
第一个问题来自:
cin >> *finNameP;
由于finNameP
的类型为char *
,因此*finNameP
的类型为char
。所以这条指令读取一个字符。然后你转到do fin.open(finNameP);
导致未定义的行为,因为finNameP
中没有字符串。
最简单的解决方法是将finNameP
设为std::string
。请注意,执行cin >> finNameP
(不更改类型)会编译,但这是一个坏主意,因为没有缓冲区溢出保护。你可以写cin >> setw(12) >> finNameP;
,但这仍然比使用字符串更糟糕。
答案 1 :(得分:0)
deckPtr < &deckPtr[maxCards]
始终为true,for循环永远运行。