`
mmdev
  • 浏览: 13169532 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Cstring使用问题和struct结构体初始化方法汇总

 
阅读更多

今天在写程序为cstringarray变量操作时遇见:

ASSERT_VALIDfailswithillegalvtablepointer.
AssertionFailed:<unknownapplication>:Filearray_s.cpp,Line236

这两个问题,几经查找、询问才知道是定义的结构体中的cstringarray虚拟表出错。

仔细看程序时才发现,我申请的结构体的指针,用memest初始化了,原来结构体没加cstringarray变量,全是char类型,所以用memset初始化。

cstringarray变量是不能用memset初始化的!!(至于为何还不很清楚......)

不用memset初始化,那我的结构体怎么初始化呢?

google一下发现有一下3种方法可以完成初始化:

1、结构体的构造函数中初始化
在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用构造函数来初始化。

如下代码所示:
struct Stu
{
int nNum;
bool bSex;
char szName[20];
char szEmail[100];

//构造函数初始化
Stu()
{
nNum = 0;
bSex = false;
memset(szName,0,sizeof(szName));
memset(szEmail,0,sizeof(szEmail));

}
};

你可能已经发现了,如果结构体中有大量成员,一个个赋值,相当麻烦。那么你可以这样写:
struct Stu
{
int nNum;
bool bSex;
char szName[20];
char szEmail[100];
//构造函数初始化
Stu()
{
memset(this,0,sizeof(Stu));
//或者是下面的格式
//memset(&nNum,0,sizeof(Stu));
}
};
如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放。以上便是在构造函数中初始化。

2、继承模板类初始化
首先定义一个模板基类:
template <typename T>
class ZeroStruct
{
public:
ZeroStruct()
{
memset(this,0,sizeof(T));
}
};
之后定义的结构体都继承于此模板类。
struct Stu:ZeroStruct<Stu>
{
int nNum;
bool bSex;
char szName[20];
char szEmail[100];
};

这样也能实现初始化。

3、定义时初始化

struct Stu
{
int nNum;
bool bSex;
char szName[20];
char szEmail[100];
};

//定义时初始化
Stu stu1 = {0};
在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:

struct Stu
{
int nSize; //结构体大小
int nNum;
bool bSex;
char szName[20];
char szEmail[100];
};

Stu stu1 = {sizeof(Stu),0};
后面的0,可以省略掉,直接写成:Stu stu1 = {sizeof(Stu)};后面自动会用0填充。
总结分析:
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。


分享到:
评论

相关推荐

    typedef struct 与 struct 的区别及初始化

    在C/C++编程语言中,`typedef` 和 `struct` 是两种不同的声明结构体类型...而结构体初始化则涉及到成员变量的初始赋值,可以使用初始化列表来实现。在实际编程中,合理使用 `typedef` 可以提高代码的可读性和可维护性。

    C/C++网络传输struct类型数据

    对于不包含数组的结构体,如`SecondData`,发送和接收的流程基本相同,只是初始化和处理的数据类型不同。结构体的每个成员都会按照它们在内存中的顺序和大小被序列化和反序列化。 值得注意的是,`send`和`recv`函数...

    快速复制结构体变量和类实例

    // 初始化original... MyStruct copy; std::memcpy(&copy, &original, sizeof(MyStruct)); ``` 这段代码中,`memcpy()`将`original`结构体的内存内容复制到`copy`,完成了一个快速的结构体复制。需要注意的是,如果...

    自-网络传输struct类型数据 .docx

    网络传输struct类型数据时,结构体不能包含可变大小的数据,如C++的CString或std::string。这意味着结构体内的成员只能是C++的基本数据类型(如int, char, bool等)或这些基本类型的固定大小数组。例如,以下是一个...

    VC笔记-如何从txt文本中读写结构体数据

    在VC++编程中,有时我们需要将结构体的...这包括了结构体的定义、初始化、文件的打开、数据的写入和读取,以及处理字符串过长的情况。在实际项目中,这样的操作可能需要进行错误检查和异常处理,以确保程序的健壮性。

    自-网络传输struct类型数据 .pdf

    初始化发送方结构体 ... send(moSndSocket, (char*)&oScdData, sizeof(SecondData), 0); // ... 接收方处理 ... SecondData rcvData; recv(m_RcvSocket, rcvBuffer, sizeof(rcvBuffer), 0); memcpy(&rcvData, ...

    CString的工作原理介绍(zz).docx

    当一个已存在的CString对象被用来初始化新的CString对象时,新对象并不会立即分配新的内存,而是直接引用原始对象的内存。只有在需要修改字符串内容时,新对象才会分配自己的内存空间。这种设计减少了不必要的内存...

    VC++类型大全内付转换类型的方法

    2. **结构体(Struct):** 包含不同数据类型的变量。 3. **联合体(Union):** 共享同一段内存的不同类型变量。 ### 字符串类型 1. **C风格字符串(char[]):** 使用空字符'\0'终止的字符数组。 2. **CString:** MFC库...

    获得本机IP地址获得本机IP地址获得本机IP地址

    - 初始化Winsock环境,指定使用的版本为2.0。 - 调用`gethostname`函数获取本机主机名。 - 通过`gethostbyname`函数根据主机名获取主机信息结构体。 - 使用`inet_ntoa`函数将结构体中的IP地址转换为字符串形式。 - ...

    Mfc获取本机IP地址

    要使用Winsock,我们需包含相应的头文件`winsock2.h`,并且在程序中初始化Winsock库: ```cpp #include #include #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsaData; if (WSAStartup...

    vc6.0 目录选择对话框

    ### vc6.0 目录选择对话框 在日常开发工作中,我们经常需要用到文件或目录的选择功能。...通过理解`BROWSEINFO`结构体的使用方法以及如何正确设置其成员,我们可以轻松实现自定义的目录选择对话框,满足实际开发需求。

    VC++任务栏提示区图标的实现详解

    首先需要定义一个`NOTIFYICONDATA`结构体,并初始化各个成员变量。这个结构体包含了与任务栏图标相关的所有信息,例如图标本身、提示文字、关联窗口等。具体结构如下: ```cpp typedef struct _NOTIFYICONDATA { ...

    MFC创建用户界面线程方法2

    在使用`CreateThread`创建用户界面线程时,我们需要自己管理更多的细节,如初始化MFC库、设置线程局部存储(TLS)以及处理消息循环。这样做的好处是可以灵活地定制线程的行为,而不仅仅是简单地执行一个函数。 线程...

    C/C++笔试题

    在 C++ 中,`struct` 和 `class` 的使用方法基本相同,只是默认访问权限不同。在 C 中,`struct` 主要用于组织数据,但在 C++ 中也可以定义成员函数。`class` 提供了更多的面向对象特性,如封装、继承和多态。 ####...

    cstring:为了更多地了解 C,我选择尝试在 C 中实现我自己的字符串版本

    1. **cstring_init**: 这个函数用于初始化cstring对象,分配内存并设置初始为空字符串。 ```c cstring cstring_init() { cstring str = {malloc(1), 0}; str.str[0] = '\0'; return str; } ``` 2. **cstring_...

    C++代码,学生信息管理系统

    系统提供了四个主要操作:初始化、插入、删除和修改,以满足不同场景的需求。 系统的核心功能是通过C++编程语言实现的,利用结构体(struct)来定义学生信息的数据结构。例如,`struct Student`包含了学生的学号...

    树形控件显示通讯录

    2. **初始化树形控件**:在C++代码中,你可以通过OnInitDialog()函数初始化树形控件。使用CTreeCtrl类的成员函数,如InsertItem(),添加根节点,然后递归地添加子节点以创建层次结构。 3. **数据结构设计**:为了...

    用VC++实现http代理

    `**:这是Winsock数据结构,用于初始化Winsock环境。 6. **`CString strHost = "111.111.111.111";`**:一个字符串变量,用于存储目标主机的IP地址。 7. **`CString DownLoadAddress = ...

    学生管理系统源代码.doc

    包含了`&lt;stdlib.h&gt;`, `&lt;string.h&gt;`, 和 `&lt;malloc.h&gt;`头文件,这些是C库的函数,尽管在C++中,更推荐使用`&lt;cstdlib&gt;`, `&lt;cstring&gt;`, 和 `&lt;new&gt;`,但在这里它们仍然有效,用于提供一些基本的库函数,如内存分配和字符...

Global site tag (gtag.js) - Google Analytics