我一直在用C语言开发一个项目,尝试使用strcpy / memcpy / strncpy复制char *时遇到了麻烦,这些似乎都不起作用。出现的问题是,大约8个或更多字符长的单词没有被完全复制。
g.V().has('location', 'name', gte('US')).
group().
by('name').
by(inE('people_location').count())
我认为上面的代码是导致错误的主要原因,但我不知道在哪里修复它。我尝试弄乱尺寸,但这没用。
如果可能的话,有人可以向我解释一种复制所有字符的方法,或者如果我没有分配足够的空间吗?
答案 0 :(得分:2)
该程序是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
替换为typedef
,因为这使我可以声明node
的实例。其他语法仅允许指向node
的指针。
我使用node
的实例代替node *
的{{1}}实例,因为任何尝试更改其地址的尝试都会出错。
我使用nodeHead
遍历列表,并在返回的节点中为nodePrev
提供目标。我将left
初始化为nodePrev
,因为它是列表的开始。我将&nodeHead
设置为nodePrev
是因为这是我在初始化期间选择遍历列表的方式。我本可以用
nodeNext
达到了相同的效果。
我仅实现了列表处理,因此我可以创建一个独立的示例,该示例无需更改即可运行。您可以放心地忽略它。
如果您想查看良好的链表代码,建议使用the linux kernel implementation。