已建立链表但无法正常工作

linked list built but not working properly

我在链表中​​有数字,我应该将其转换为 char* 和 return。

这是可能存在问题的函数。

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->data 的最后一次调用总是以未知的垃圾值结束。 (链接列表构建正确,因为打印链接列表工作正常。)

例子:链表是1->2->3

函数中对 temp->data 的最后一次调用给出了 50(一些垃圾值) 即1->2->50

而在主函数中,列表正确给出 1->2->3

最后一个变量在此函数中以垃圾结尾,但在主函数中正确显示,为什么?

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));

因为the result of malloc should not be casted.

这段代码很可能会完成这项工作。不需要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;
}

我认为问题不在于字符串操作。很可能它与链表的创建有关。试试这个:

首先,尝试在循环中打印temp->data 的值。可能它应该是垃圾(在这种情况下列表创建包含问题)。如果打印值正确,则检查返回的 "result" 字符串是否包含相同的值。如果不是,那么问题出在 myitoa 函数中。

这里我假设 myitoa 正在为 string1 分配内存。(如果没有,那么你必须在将它传递给函数之前或在 myitoa.