c - 尝试在 C 中复制 char* 时数据丢失
问题描述
我一直在用 C 语言开发一个项目,但在尝试使用 strcpy/memcpy/strncpy 复制 char* 时遇到问题,这些似乎都不起作用。出现的问题是大约 8 个或更多字符长的单词没有被完全复制。
typedef struct wordFrequency {
char * word;
int frequency;
struct wordFrequency *left, *right;
} *node;
node setnode(char * word) {
node newNode = (node)malloc(sizeof(node));
newNode->word = (char*)malloc(sizeof(word));
strcpy(newNode->word, word); //This is where I'm having trouble
newNode->frequency = 1;
newNode->right = NULL;
return newNode;
}
上面的代码是我认为是错误的主要原因,但我不知道在哪里修复它。我试过弄乱尺寸,但这没有用。
如果可能的话,有人可以向我解释一种复制所有字符的方法,或者我没有分配足够的空间吗?
解决方案
这个程序是一个mcve,它展示了如何正确分配和初始化链表中的每个节点:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAY_SIZE(array) \
(sizeof(array) / sizeof(array[0]))
typedef struct wordFrequency {
char *word;
int frequency;
struct wordFrequency *left, *right;
} node;
node *setnode(char *word) {
node *newNode = malloc(sizeof(node));
newNode->word = malloc(strlen(word) + 1);
strcpy(newNode->word, word);
newNode->frequency = 1;
newNode->right = NULL;
return newNode;
}
int main() {
char *wordList[] = {"one", "two", "three"};
node nodeHead;
node *nodePrev = &nodeHead;
node *nodeNext;
for (int index = 0; index < ARRAY_SIZE(wordList); index++) {
nodeNext = setnode(wordList[index]);
nodePrev->right = nodeNext;
nodeNext->left = nodePrev;
nodePrev = nodeNext;
}
for (node *nodePtr = nodeHead.right; nodePtr != NULL; nodePtr = nodePtr->right) {
printf("word = %s, frequency = %d\n", nodePtr->word, nodePtr->frequency);
}
return 0;
}
输出
word = one, frequency = 1
word = two, frequency = 1
word = three, frequency = 1
笔记
该程序没有错误检查,也不会释放分配的内存。此代码不应在生产环境中使用。
回复评论中的问题
我*node
用node
in替换了,typedef
因为它允许我声明node
. 另一种语法只允许指向node
.
我使用了一个实例node
而不是node *
for,nodeHead
因为任何更改其地址的尝试都是错误的。
我nodePrev
用来遍历列表并left
在返回的节点中提供一个目标。我初始化nodePrev
为,&nodeHead
因为它是列表的开始。我设置nodePrev
为nodeNext
因为这就是我在初始化期间选择遍历列表的方式。我本来可以用
nodePrev = nodePrev->right;
并达到了同样的效果。
我只实现了列表处理,以便我可以创建一个无需更改即可运行的独立示例。您可以放心地忽略它。
如果你想看好的链表代码,我推荐linux内核实现。
推荐阅读
- java - 如何将 websocket 应用程序作为我现有项目 Spring Boot 的一部分添加?
- javascript - 使用 yarn 构建时 JavaScript 内存不足
- java - 无法资助文件位置
- vue.js - Webpack 和 Laravel Mix 3 的 Sass Loader 问题
- javascript - “订阅”类型缺少“可观察”类型的以下属性
': _isScalar、source、operator、lift 和另外 6 个 - python - 我想在 python 3 中以不同的方式合并两个列表
- python - 如何查看json的结果
- java - 尝试在 Eclipse 中运行复合 GUI
- python - 在 R 或 Python 中表示优势比和 p 值的好方法
- c++ - 如何让 std::istream 从键盘获取输入(如 std::cin)?