转换链接列表从C到c++
Converting link list from C to C++
我有一个工作链表实现在C(从linux),我想转换为使用在c++(在windows上)。
我有一个播放器结构,它看起来像这样:typedef struct PLAYER {
char * name;
struct PLAYER * next;
} player;
在我最初的C代码中,我像这样初始化了播放器列表:
player * player_list;
player_list = malloc(sizeof(player));
但是,对于在C中使用,我不能使用(void *),所以我需要像这样强制转换它:
player * player_list;
player_list = (player*)malloc(sizeof(player));
对于添加/链接玩家的使用,我检查链表中的项目是否设置为NULL
,但是经过一些调试后,我可以看到在c++中malloc'ed数据不像C中那样设置为NULL
。
例如,在C实现中,current->next == NULL
为真,而在c++中,它为假。
我的问题是,我如何在c++中malloc数据,使数据默认设置为NULL
?从而允许我使用原来的函数
如果您需要在c++中创建链表,则应该使用new
操作符来分配内存,而不需要typedef
。
struct Node
{
std::string name;
Node * next;
};
// creating a new node
Node * p_node = new Node;
Node.name = "John";
Node.next = nullptr;
注意从char[]
到std::string
的变化。std::string
类型应该用于文本,因为它处理文本内容的分配和回收。
此外,您最终将希望使用template
,以便您可以将链表数据结构应用于不同的节点类型。
或者您可以简化您的生活并使用std::list
,如:
std::list<name> name_database;
我的问题是,如何在c++中malloc数据,使数据默认设置为NULL ?从而允许我使用原来的函数。
你不需要。
在c++中将代码转换为链表的最简单方法是
struct PLAYER {
std::string name;
};
和使用
std::list<PLAYER> player_list;
std::list
容器类已经实现了一个链表。
分配内存并初始化为0的函数是calloc
。对于c++和C来说是一样的,malloc
不会将内存归零,但calloc
会。它在c语言中"有效"是一个"巧合"。
要充分利用c++的优势,可以使用标准库容器,如std::list
或std::deque
,以及智能指针。
虽然我建议您完全接受c++并转向STL容器,但我猜您希望在开始之前做最少的工作来恢复并运行单元测试。我写这篇文章是为了给你最少的修改,让你可以根据测试开始重构。
为struct添加构造函数:
struct PLAYER {
char * name;
struct PLAYER * next;
PLAYER()
: name(), next()
{}
};
或者,使用最新的c++来使更改最小化:
struct PLAYER {
char *name = nullptr;
struct PLAYER *next = nullptr;
};
然后你可以替换你的calloc()
或malloc()
与一个简单的new PLAYER()
和匹配free()
与delete
,并准备开始你的重构。
为了更符合c++的习惯,首先要改变的是原始指针——您将使用std::string
代替char*
,使用std::unique_ptr
或std::shared_ptr
作为大多数其他指针(当您移动到标准容器时,链表中的PLAYER*
将消失)。
我的问题是,我如何在c++中
malloc
数据,使数据默认设置为NULL ?
在c++ 或 C中,没有办法动态地为指针分配内存,这两种标准都确保指针最初是NULL
。在实践中,使用calloc()
而不是malloc()
进行分配可能会产生这种效果,因为它将所有分配的字节初始化为0。尽管具有所有字节0
的指针表示通常是NULL
指针的表示,但是,标准并不要求必须是。(这与空指针常量的源代码表示的问题不同。)然而,如果你只关心Windows和msvc++,那么calloc()
应该可以满足你的需要。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 有人能帮我处理这个链接列表吗?C++