自制字符串类中的异常 我在java中编写了一个C++类,名为DcString,类似于String类。 class DCstring { public: TCHAR *string; DCstring(); DCstring(TCHAR * str); DCstring in(); } DCstring::DCstring() { string=NULL; } //constructor to initialize DCstring::DCstring(TCHAR* temp) { _TINT i=0; string=(TCHAR*)malloc(_tcslen(temp)*sizeof(TCHAR)+1); for(;i<_tcslen(temp);i++) string[i]=temp[i]; string[i]=0; } //to get input from user DCstring DCstring::in() { wprintf(L"\n Enter the string :"); TCHAR arr[200],*s; _getts(arr); _TINT i=0; string=(TCHAR*)realloc(string,_tcslen(arr)*sizeof(TCHAR)+1); for(;i<_tcslen(arr);i++) string[i]=arr[i]; string[i]=0; return(*this); }

自制字符串类中的异常 我在java中编写了一个C++类,名为DcString,类似于String类。 class DCstring { public: TCHAR *string; DCstring(); DCstring(TCHAR * str); DCstring in(); } DCstring::DCstring() { string=NULL; } //constructor to initialize DCstring::DCstring(TCHAR* temp) { _TINT i=0; string=(TCHAR*)malloc(_tcslen(temp)*sizeof(TCHAR)+1); for(;i<_tcslen(temp);i++) string[i]=temp[i]; string[i]=0; } //to get input from user DCstring DCstring::in() { wprintf(L"\n Enter the string :"); TCHAR arr[200],*s; _getts(arr); _TINT i=0; string=(TCHAR*)realloc(string,_tcslen(arr)*sizeof(TCHAR)+1); for(;i<_tcslen(arr);i++) string[i]=arr[i]; string[i]=0; return(*this); },c++,exception,C++,Exception,此代码可以第一次读取和写入数据。当我重新执行代码并调用Show(stud*temp,FILE*FILE)函数时,它会抛出运行时错误/异常 "Unhandled exception at 0x77c815de in StudentRecord.exe: 0xC0000005: Access violation reading location 0x002850a8". 内存中似乎有问题。请帮我解决。问题在这里: public: TCHAR *string; 这会写出一个指向字符串的指

此代码可以第一次读取和写入数据。当我重新执行代码并调用
Show(stud*temp,FILE*FILE)
函数时,它会抛出运行时错误/异常

"Unhandled exception at 0x77c815de in StudentRecord.exe: 0xC0000005: Access violation reading location 0x002850a8".
内存中似乎有问题。请帮我解决。

问题在这里:

public:
    TCHAR  *string;
这会写出一个指向字符串的指针,因此当您读回时,会得到一个不指向任何数据的指针,从而导致访问冲突,这就是你可能想要做的

此外:

fflush(stdin);
这是一种未定义的行为

此外,您还应该使用C++ <代码> STD::String 和<代码> STD::I/OFFROWS/CODE> < /P> 编辑我刚刚注意到:

wprintf ( L"\n%s %d %c",temp->name ) ;
您没有与
%d
%c
参数匹配的任何内容。

问题在于:

public:
    TCHAR  *string;
这会写出一个指向字符串的指针,因此当您读回时,会得到一个不指向任何数据的指针,从而导致访问冲突,这就是你可能想要做的

此外:

fflush(stdin);
这是一种未定义的行为

此外,您还应该使用C++ <代码> STD::String 和<代码> STD::I/OFFROWS/CODE> < /P> 编辑我刚刚注意到:

wprintf ( L"\n%s %d %c",temp->name ) ;

您没有与
%d
%c
参数匹配的任何内容。

除了
DCString
类的实现不佳(暴露的实例变量、缺少析构函数、固定大小的输入缓冲区等)之外,您无法理解编写
结构stud的实例不会,事实上,编写由
stud.name.string
指向的数据内容

struct stud
包含一个
DCString
的实例,但是用于存储字符串数据的内存在堆上(您使用
malloc()
分配);您的代码正在编写指向已分配内存的指针,当您读回它时(当然是在不同的会话中),这将是毫无意义的


您需要提供一个读/写
DCString
方法,该方法通过一个
文件*
(最好使用
istream
ostream
,因为这是C++)来读/写字符串内容,在读取过程中分配新内存。

除了您的
DCString
类实现不佳(暴露的实例变量、缺少析构函数、固定大小的输入缓冲区等等)之外,您无法理解编写
struct stud
的实例实际上不会,写入由
stud.name.string
指向的数据内容

struct stud
包含一个
DCString
的实例,但是用于存储字符串数据的内存在堆上(您使用
malloc()
分配);您的代码正在编写指向已分配内存的指针,当您读回它时(当然是在不同的会话中),这将是毫无意义的


您需要提供一个读/写
DCString
方法,该方法通过一个
文件*
(最好使用
istream
ostream
,因为这是C++)来读/写字符串内容,在读取期间分配新内存。

您尝试过使用调试器吗?这就是它的目的,毕竟。。。事实上,你为什么不使用
std::string
?我可能有点离题了,但当我看到你的代码时,我的第一个想法是:你不使用
std::string
吗?显示DCstring的默认构造函数,它将在结构中调用。行
(temp->name)=DCstring()没有任何意义。如何调用Show函数?可能是空指针?该类违反并因此泄漏内存。您是否尝试过使用调试器?这就是它的目的,毕竟。。。事实上,你为什么不使用
std::string
?我可能有点离题了,但当我看到你的代码时,我的第一个想法是:你不使用
std::string
吗?显示DCstring的默认构造函数,它将在结构中调用。行
(temp->name)=DCstring()没有任何意义。如何调用Show函数?可能是空指针?该类违反了规则,因此会泄漏内存。不,这不是他的问题。如果您所指的是无关的
printf
参数,我会额外添加一条注释。不;看看
fread()
fwrite()
函数在做什么,想想它们的含义。嘿,当我第一次看到它们时,我的眼睛都呆呆了:如果我们假设
head
InsertToFile
中的
temp
,那么
fwrite
是可以的,但是
fread(&temp,sizeof(stud),1,file) ;不应在
temp
之前使用
&
。谢谢你指出这一点!对不起,甚至不是那样。正如我在回答中提到的,如果OP希望读取和写入字符串内容,那么简单地将对象写入文件将无法完成这项工作。这不仅是错误的做法和不可移植性,它根本不起作用,因为字符串内容实际上在堆上,所有
fwrite()
将写入的指针在读回时毫无意义。不,这不是他的问题。我额外添加了一条关于无关
printf
参数的注释,如果这就是你所指的;看看
fread()
fwrite()
函数在做什么,想想它们的含义。嘿,当我第一次看到它们时,我的眼睛都呆呆了:如果我们假设
head
InsertToFile
中的
temp
,那么
fwrite
是可以的,但是
fread(&temp,sizeof(stud),1,file) ;不应在
temp
之前使用
&
。谢谢你指出这一点!对不起,甚至不是那样。正如我在回答中提到的,如果OP希望读写字符串conte