我正在尝试创建一个链接列表结构来存储数据。链表的标题似乎正在以某种方式更新。我有以下代码。我似乎无法弄清楚如何将char数组数据放入节点中,并防止在更新char数组数据的地址时更新它。

以下代码打印出将任何字符串传递给processStr函数。我该如何避免更新?

//Linked List Structure
mainNode *head = NULL;

//take and store word in data structure
void processStr(char *str){

    //char array
   char strArray[sizeof(str)+1];

    //stores lower case string
    char strLower[strlen(str)];
    int i;
    for(i = 0; str[i]; i++)
            strLower[i] = tolower(str[i]);
    strLower[i] = '\0';

    //printf("%s : ", strLower);

    //Starts Linked List
    if(head == NULL){

            mainNode *mainPtr = (mainNode *)malloc(sizeof(mainNode));
            nameNode *namePtr = (nameNode *)malloc(sizeof(nameNode));

            mainPtr->name = strLower;
            mainPtr->numOccurances = 1;
            mainPtr->next = NULL;
            mainPtr->nextName = namePtr;

            namePtr->name = strArray;
            namePtr->next = NULL;

            head = mainPtr;

    }

    printf("%s : " , head->name);
}

最佳答案

您将指针mainPtr->namenamePtr->name分配给在strLower中本地声明的变量strArrayprocessStr()。这意味着该函数返回后,对这些指针的任何访问都将导致未定义的行为。你可以做某事。喜欢

 mainPtr->name = strdup( strLower );


而是为字符串分配内存。

顺便说一句:strLower也必须声明为char strLower[strlen(str)+1];

07-24 09:48