我正在尝试创建一个链接列表结构来存储数据。链表的标题似乎正在以某种方式更新。我有以下代码。我似乎无法弄清楚如何将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->name
和namePtr->name
分配给在strLower
中本地声明的变量strArray
和processStr()
。这意味着该函数返回后,对这些指针的任何访问都将导致未定义的行为。你可以做某事。喜欢
mainPtr->name = strdup( strLower );
而是为字符串分配内存。
顺便说一句:
strLower
也必须声明为char strLower[strlen(str)+1];