如何用C实现多分支树结构
好久没用C写代码了。 我正在尝试做一个多叶树。我正在尝试将 C# trie 实现转换为 C,以便使用 CUDA 在 GPU 上运行它。但我一直坚持这一点。你能帮我吗?
我的节点实现如下:
struct Node2 {
char *Key;
char *ConsAlterKey;
char *MasterKey;
bool VowelDeletion;
char *Data;
char *MasterData;
Node2 *Childs;
int ChildCount;
};
这是我的将节点添加到 trie 的函数:
void AddAsChildren2(Node2 *Trie,int count)
{
//Trie->Childs=new Node2[count];
Trie->Childs=(Node2 *)malloc(sizeof(Node2)*count);
for(int i=0;i<count;i++)
{
Trie->Childs[i].Key= GetKey();
Trie->Childs[i].ConsAlterKey=GetConsAlterKey();
Trie->Childs[i].MasterKey=GetMasterKey();
Trie->Childs[i].VowelDeletion=GetVowelDeletion();
Trie->Childs[i].Data=GetData();
Trie->Childs[i].MasterData=GetMasterData();
Trie->Childs[i].ChildCount=GetChildCount();
if(Trie->Childs[i].ChildCount> 0)
{
AddAsChildren2(&(Trie->Childs[i]),Trie->Childs[i].ChildCount);
}
}
}
我从主函数中调用它,如下所示:
Node2 NodeNew;
.
.
.
AddAsChildren2(&NodeNew,NodeNew->ChildCount);
TraverseTree2(&NodeNew);
但是当我尝试遍历树时,我得到错误的值,有时会出现异常。(可能是子节点的内存分配问题)
我在这里做错了什么?
Ps:第一个节点有子节点,我在分配值方面没有问题,因此忽略“getter”函数。我已经更改了它们以简化代码。我的问题是,代码完成这部分后我丢失了值。
感谢您的快速响应。我从文件中读取了值。
文件的结构如下所示。
<强><关键 ConsAlterKey MasterKey VowelDeletion 数据 MasterData ChildCount 或 >
如果行/项目没有子节点,则以“>”结尾否则以 ChildCount 值结尾。这里“-”字符表示 NULL 值。
< root - - - - - 2
< a - - False - - 4
< aö - - False 184 - >
< dfı - - False 188 - >
< et ed - False 189 - 3
< aö - - False 184 - >
< dfı - - False 188 - >
< k ğ - False 191 - >
>
< k ğ - False 191 - >
>
< a - - False - - 4
< aö - - False 184 - >
< dfı - - False 188 - >
< et ed - False 189 - 3
< aö - - False 184 - >
< dfı - - False 188 - >
< k ğ - False 191 - >
>
< k ğ - False 191 - >
>
>
我的代码的不是简化版本如下:
void AddAsChildren2(Node2 *Trie,FILE *fp,int count)
{
char string[50];
char *line=NULL;
char *Temp;
Trie->Childs=(Node2 *)malloc(sizeof(Node2)*count);
//Trie->Childs=new Node2[count];
for(int i=0;i<count;i++)
{
if(fgets(string,50,fp))
{
line=strtok(string," ");
if(strcmp (line,"<")==0)
{
line=strtok( NULL, " ");
Trie->Childs[i].Key= (strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].ConsAlterKey=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].MasterKey=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].VowelDeletion=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].Data=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].MasterData=(strcmp(line,"-")==0?"":line);
Temp = strtok( NULL, " ");
if(strcmp(Temp,">")==0)
{
//ends with >
Trie->Childs[i].ChildCount=0;
}
else if((strcmp(Temp,"\n")!=0)&&(strlen(Temp)> 0))
{
//ends with childcount value so it have childs
Trie->Childs[i].ChildCount=atoi(Temp);
AddAsChildren2(&(Trie->Childs[i]),fp,Trie->Childs[i].ChildCount);
}
}
}
}
}
遍历函数如下:
void traversetree2(Node2 *tree)
{
printf("Key %s\n",tree->Key);
printf("ConsAlterKey %s\n",tree->ConsAlterKey);
printf("MasterKey %s\n",tree->MasterKey);
printf("Data %s\n",tree->Data);
printf("MasterData %s\n",tree->MasterData);
if(tree->ChildCount>0)
{
for(int i=0;i<tree->ChildCount;i++)
{
traversetree2(&(tree->Childs[i]));
}
}
}
输出为:
Key root
ConsAlterKey
MasterKey
Data
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
ConsAlterKey
MasterKey
Data
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
ConsAlterKey ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
ConsAlterKey ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterData
I haven't written code in C for long time.
Im trying to do a multi-leaf tree.Im trying to convert a C# trie implementation to C in order to run it on GPU with CUDA.But i've stuck on this.Can you help me?
My node implementation as follows:
struct Node2 {
char *Key;
char *ConsAlterKey;
char *MasterKey;
bool VowelDeletion;
char *Data;
char *MasterData;
Node2 *Childs;
int ChildCount;
};
And here is my function that adds nodes to trie:
void AddAsChildren2(Node2 *Trie,int count)
{
//Trie->Childs=new Node2[count];
Trie->Childs=(Node2 *)malloc(sizeof(Node2)*count);
for(int i=0;i<count;i++)
{
Trie->Childs[i].Key= GetKey();
Trie->Childs[i].ConsAlterKey=GetConsAlterKey();
Trie->Childs[i].MasterKey=GetMasterKey();
Trie->Childs[i].VowelDeletion=GetVowelDeletion();
Trie->Childs[i].Data=GetData();
Trie->Childs[i].MasterData=GetMasterData();
Trie->Childs[i].ChildCount=GetChildCount();
if(Trie->Childs[i].ChildCount> 0)
{
AddAsChildren2(&(Trie->Childs[i]),Trie->Childs[i].ChildCount);
}
}
}
which i call it from main function like this:
Node2 NodeNew;
.
.
.
AddAsChildren2(&NodeNew,NodeNew->ChildCount);
TraverseTree2(&NodeNew);
But when i try to traverse tree i get wrong values and sometimes exceptions.(Possibly memory allocation problem of child nodes)
What am i doing wrong here?
Ps:First node has child nodes and I have no problem with assigning values so ignore "getter" functions.I have changed them inorder to simplfy code.My problem is that i lose values after code completes this part.
Thanks for fast response.I read values from a file.
The structure of file looks like this.
< Key ConsAlterKey MasterKey VowelDeletion Data MasterData ChildCount or >
If a line/item has no child nodes it ends with ">" else it ends with ChildCount value.And here "-" character presents NULL value.
< root - - - - - 2
< a - - False - - 4
< aö - - False 184 - >
< dfı - - False 188 - >
< et ed - False 189 - 3
< aö - - False 184 - >
< dfı - - False 188 - >
< k ğ - False 191 - >
>
< k ğ - False 191 - >
>
< a - - False - - 4
< aö - - False 184 - >
< dfı - - False 188 - >
< et ed - False 189 - 3
< aö - - False 184 - >
< dfı - - False 188 - >
< k ğ - False 191 - >
>
< k ğ - False 191 - >
>
>
And not simplified version of my code as follows:
void AddAsChildren2(Node2 *Trie,FILE *fp,int count)
{
char string[50];
char *line=NULL;
char *Temp;
Trie->Childs=(Node2 *)malloc(sizeof(Node2)*count);
//Trie->Childs=new Node2[count];
for(int i=0;i<count;i++)
{
if(fgets(string,50,fp))
{
line=strtok(string," ");
if(strcmp (line,"<")==0)
{
line=strtok( NULL, " ");
Trie->Childs[i].Key= (strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].ConsAlterKey=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].MasterKey=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].VowelDeletion=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].Data=(strcmp(line,"-")==0?"":line);
line=strtok( NULL, " ");
Trie->Childs[i].MasterData=(strcmp(line,"-")==0?"":line);
Temp = strtok( NULL, " ");
if(strcmp(Temp,">")==0)
{
//ends with >
Trie->Childs[i].ChildCount=0;
}
else if((strcmp(Temp,"\n")!=0)&&(strlen(Temp)> 0))
{
//ends with childcount value so it have childs
Trie->Childs[i].ChildCount=atoi(Temp);
AddAsChildren2(&(Trie->Childs[i]),fp,Trie->Childs[i].ChildCount);
}
}
}
}
}
Traverse function as follows:
void traversetree2(Node2 *tree)
{
printf("Key %s\n",tree->Key);
printf("ConsAlterKey %s\n",tree->ConsAlterKey);
printf("MasterKey %s\n",tree->MasterKey);
printf("Data %s\n",tree->Data);
printf("MasterData %s\n",tree->MasterData);
if(tree->ChildCount>0)
{
for(int i=0;i<tree->ChildCount;i++)
{
traversetree2(&(tree->Childs[i]));
}
}
}
And output is:
Key root
ConsAlterKey
MasterKey
Data
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
ConsAlterKey
MasterKey
Data
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
ConsAlterKey ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░÷E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
ConsAlterKey
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterData
Key ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
ConsAlterKey ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterKey
Data ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠§E
MasterData
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
啊,有了更多的代码就很容易了:你的问题是 char string[50] 是一个局部变量,你将许多指针保存到这个本地数组中,当
AddAsChildren2
返回时这些指针就会丢失。根据您是否需要释放此结构,您可以strdup()
整行,然后保存其中的标记,或者strdup()
每个单独的标记(以简化释放)。Ah, with more code it's easy: Your problem is that
char string[50]
is a local variable and you save many pointers into this local array which is lost whenAddAsChildren2
returns. Depending on whether you ever need to free this structure you couldstrdup()
the whole line and then save the tokens from it orstrdup()
each individual token (to simplify freeing).