C语言while循环中char*类型字符串变量赋值问题排查
问题原因
你遇到的问题核心是所有指针都指向了同一个栈缓冲区:
wordList是在readFile函数栈上分配的固定大小数组,每次fgets都会把新的行内容覆盖到这个数组里。strtok返回的token指针,本质是指向wordList内部的某个位置,并不是新开辟的内存空间。- 因此
englishWords数组里存储的所有指针,最终都指向同一个wordList缓冲区,当循环结束后,缓冲区里是最后一行的内容,所有指针自然都显示最后一个单词。
解决方法
核心是为每个字符串分配独立的内存空间,有两种常用修复方式:
方法1:使用strdup快速复制字符串
strdup会自动分配足够的内存并复制字符串,使用简洁:
while(fgets(wordList, MAX_SIZE, fptr) != NULL){ char *token = strtok(wordList, "="); // 复制token到新分配的内存,再存入数组 englishWords[*line] = strdup(token); *line += 1; }
注意:
strdup是POSIX标准函数,部分编译器可能需要开启特定选项;使用后记得在程序结束前用free释放每个元素的内存,避免泄漏。
方法2:手动分配内存并复制
如果需要更明确的内存控制,可手动用malloc和strcpy:
while(fgets(wordList, MAX_SIZE, fptr) != NULL){ char *token = strtok(wordList, "="); if(token != NULL){ // 计算需要的内存长度(+1是为了存储字符串结束符'\0') size_t str_len = strlen(token) + 1; // 分配内存 englishWords[*line] = malloc(str_len); // 检查内存分配是否成功 if(englishWords[*line] != NULL){ strcpy(englishWords[*line], token); *line += 1; } } }
额外需修复的问题
- 移除多余的头文件
<cstdlib>,这是C++的头文件,C程序用<stdlib.h>就足够。 - 文件路径中的反斜杠需要转义:把
"C:\Users\xxx\Desktop\english_words.txt"改成"C:\\Users\\xxx\\Desktop\\english_words.txt",否则反斜杠会被当成转义字符,导致文件打开失败。 - 增加
fopen的错误检查:如果fptr为NULL,及时报错退出,避免后续空指针操作:fptr = fopen("C:\\Users\\xxx\\Desktop\\english_words.txt", "r"); if(fptr == NULL){ perror("Failed to open file"); return; } - 程序结束前遍历
englishWords数组,用free释放每个元素的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者DertliSelo
相关产品推荐
相关产品推荐

