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

C语言从子函数返回后陷入死循环问题求助

问题分析与修复方案

核心问题拆解

1. 死循环的根源

  • 无效的break判断:if (expenses[i]== NULL || expenses[i] == '\0')完全没用。expenses[i]是二维数组的行数组名,会被隐式转换为指向该行首元素的指针,永远不可能等于NULL;而expenses[i] == '\0'是把指针地址和ASCII值为0的字符做比较,类型不匹配,永远为假,这个break永远触发不了。
  • 数组越界风险:如果ROWS定义的数值≤2,当i递增到2时,expenses[i]已经超出数组范围,访问的是未知内存区域,expenses[i][0]不一定是'\0',导致循环永远无法退出。

2. Parse函数的致命错误

char *cpyexp;是未初始化的野指针,直接调用strcpy(cpyexp, exp)会把数据复制到随机内存地址,属于未定义行为——可能导致程序崩溃、数据损坏,甚至间接引发奇怪的循环问题。必须先为指针分配有效内存。

3. 需求逻辑不匹配

你原本要判断每行的列数是否为5,但当前代码里却是判断字符串长度是否为9,这和需求完全不符。列数判断应该通过拆分字符串统计,而非简单检查长度。

修正后的代码示例

#include <stdio.h>
#include <string.h>

#define ROWS 3
#define COLS 20

int parse(char* exp, char* exp_str) {
    char d[] = ","; // 按逗号拆分列
    char cpyexp[100]; // 分配栈内存,避免野指针问题
    strcpy(cpyexp, exp);
    
    // 统计列数
    int col_count = 0;
    char* token = strtok(cpyexp, d);
    while (token != NULL) {
        col_count++;
        token = strtok(NULL, d);
    }
    
    if (col_count != 5) {
        fprintf(stderr, "error1: parse() failed, column count is %d, expected 5\n", col_count);
        return 1;
    }    

    strcpy(exp_str, exp); // 按需处理exp_str
    return 0; 
 }

int main(int argc, char** argv) {
    char* file = NULL ;
    // 最后一行留空作为循环结束标志,同时避免越界
    char expenses[ROWS][COLS] = {{"CAR,14,10,5,2024"},{"INS,10,12,3,2024"},{""}}; 
    char expenses_str[ROWS][30] ;     

    int i = 0; 
    // 双重判断:当前行非空 + 未超出数组边界
    while (expenses[i][0] != '\0' && i < ROWS) {
        if (parse(expenses[i], expenses_str[i]) == 1) {
            fprintf(stderr, "error3: parse_instruction() failed\n");
            return 1;  
        }
        i++;
    }
    return 0;
}

关键注意事项

  • 野指针是C语言新手高频踩坑点:使用指针前必须确保它指向有效内存——要么用栈数组分配,要么用malloc动态分配。
  • 数组操作必须加边界判断:循环时加入i < ROWS这类条件,彻底避免越界访问未知内存的风险。
  • 数组名≠指针:数组名会隐式转成指针,但它本身是常量指针,永远不会等于NULL,不要做无意义的比较。
  • 需求实现要精准:列数判断依赖字符串拆分,不能用长度判断偷懒,否则遇到内容不同但长度相同的字符串会出错。

内容的提问来源于stack exchange,提问作者Ada_lovelace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:40:25