首页 文章

链表 Build 但不能正常工作

提问于
浏览
0

我在链表中有数字,我应该转换为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-> data的最后一次调用总是会产生未知的垃圾值 . (链接列表正确构建,因为打印链接列表正常工作 . )

示例:链接列表为1-> 2-> 3

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

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

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

3 回答

  • 2
    char* string1;
    

    这声明了一个指针,但没有为字符串分配缓冲区 . 这个未初始化的指针传递给 myitoa 有点令人困惑,因为 myitoa 不能对它做任何事情而不会导致未定义的行为 .

    该行总是在32位系统上分配5个字节:

    str=(char*)malloc(1+sizeof(string1));
    

    sizeof(string1)pointer 的大小,而不是字符串的大小 . 使用

    str=(char*)malloc(1+strlen(string1));
    

    相反,或甚至更好地使用

    str=malloc(1+strlen(string1));
    

    因为the result of malloc should not be casted.

  • 0

    这段代码很可能会完成这项工作 . 没有必要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;
    }
    
  • 1

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

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

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

相关问题