You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:57:22