我在链表中有数字,我应该转换为char *并返回。
这是可能存在问题的函数。
char* int_str(struct Node** head,char* result) //head is pointer to singly linked list
{
struct Node* temp = *head;
char* string1="";
char* str;
while(temp != NULL)
{
string1=myitoa(temp->data,string1); // myitoa() works fine
str=(char*)malloc(1+strlen(string1));
strcpy(str,string1);
strcat(result,str);
temp=temp->next;
}
return result;
}
对temp->数据的最后一次调用总是会产生未知的垃圾值。 (链接列表正确构建,因为打印链接列表可以正常工作。)
示例:链接列表是1-> 2-> 3
函数中对temp->数据的最后一次调用给出了50(一些垃圾值) 即1-> 2-> 50
在主要功能中,列表正确地给出1-> 2-> 3
最后一个变量在此函数中最终变为垃圾但在主函数中正确显示为什么?
答案 0 :(得分:2)
char* string1;
这声明了一个指针,但没有为字符串分配缓冲区。这个未初始化的指针传递给myitoa
有点令人困惑,因为myitoa
无法对它做任何事情而不会导致未定义的行为。
该行总是在32位系统上分配5个字节:
str=(char*)malloc(1+sizeof(string1));
sizeof(string1)
是指针的大小,而不是字符串的大小。使用
str=(char*)malloc(1+strlen(string1));
相反,或者更好的是,使用
str=malloc(1+strlen(string1));
答案 1 :(得分:1)
这段代码很可能会完成这项工作。没有必要malloc。 str定义为20个字符的数组。这是存储ASCII数字的地方。
char* int_str(struct Node** head,char* result) //head is pointer to singly linked list
{
struct Node* temp = *head;
char str[20];
while(temp != NULL)
{
strcat(result, myitoa(temp->data, str));
temp=temp->next;
}
return result;
}
答案 2 :(得分:0)
我认为问题不在于字符串操作。最有可能的是它与链表的创建有关。试试这个:
首先,尝试在循环中打印temp->数据的值。可能它应该是垃圾(在这种情况下,列表创建包含问题)。如果打印值正确,则检查正在返回的“result”字符串是否保持相同的值。如果没有,则问题出在 myitoa 功能中。
这里我假设 myitoa 正在为string1分配内存。(如果没有,那么你必须在将它传递给函数或者在 myitoa