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

C语言程序未进入Solve函数问题求助(已尝试指针初始化)

问题根源分析

兄弟,你这段代码的核心问题出在main函数里的指针处理上——start1和length1是野指针,它们没有指向任何有效的内存空间,你直接对它们解引用赋值*length1=0和*start1=0的时候,已经触发了未定义行为。程序很可能在这一步就崩溃或者出现诡异的执行流程,自然就没机会进入Solve函数了。

修正方案

你有两种简单的修正方式,任选其一即可:

方式一:使用普通变量(推荐,更简单安全)

直接用普通int变量存储起始位置和长度,调用Solve时传递变量的地址:

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

// 补充你未给出的CHECK函数示例(根据你的需求实现逻辑)
int CHECK(char* s, int k, int i, int j) {
    // 这里写你的子串校验逻辑,比如判断子串中不同字符数量是否<=k
    return 1; // 示例返回值
}

int Longest(char*s, int k, int *start, int * length,int beg,int len) { 
    int i, j, temp; 
    for(i=beg; i<len; i++) { 
        for(j=1; j<len-i; j++) { 
            temp=CHECK(s,k,i,j); 
            if(temp==1) { 
                if(j>*length) { 
                    *length=j; 
                    *start=i; 
                } 
            } 
        } 
    } 
    if(*length!=0) return 1; 
    return 0; 
}

int Solve(char*s, int k, int * start, int *length) { 
    int len=strlen(s); 
    printf("已进入Solve函数\n"); // 可以加这句验证执行流程
    return (Longest(s,k,start,length,0,len)); 
}

int main() { 
    int a ; 
    int start1 = 0; // 普通int变量,自动分配内存
    int length1 = 0;
    a=Solve("abcbca",2,&start1,&length1); // 传递变量的地址给指针参数
    printf("%d\n",a); 
    return 0; // main返回0是C语言规范的正常退出标识
}

方式二:给指针分配动态内存

如果你一定要使用指针,记得先通过malloc给它分配有效的内存空间,用完后还要释放避免内存泄漏:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 引入malloc/free的头文件

// 同样补充CHECK函数
int CHECK(char* s, int k, int i, int j) {
    return 1;
}

// 保留你原有的Longest和Solve函数
int Longest(char*s, int k, int *start, int * length,int beg,int len) { 
    int i, j, temp; 
    for(i=beg; i<len; i++) { 
        for(j=1; j<len-i; j++) { 
            temp=CHECK(s,k,i,j); 
            if(temp==1) { 
                if(j>*length) { 
                    *length=j; 
                    *start=i; 
                } 
            } 
        } 
    } 
    if(*length!=0) return 1; 
    return 0; 
}

int Solve(char*s, int k, int * start, int *length) { 
    int len=strlen(s); 
    printf("已进入Solve函数\n");
    return (Longest(s,k,start,length,0,len)); 
}

int main() { 
    int a ; 
    // 给指针分配内存
    int* start1 = malloc(sizeof(int)); 
    int* length1 = malloc(sizeof(int));
    
    // 检查内存分配是否成功
    if(start1 == NULL || length1 == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    
    *length1=0; 
    *start1=0; 
    a=Solve("abcbca",2,start1,length1); 
    printf("%d\n",a); 
    
    // 释放动态分配的内存
    free(start1);
    free(length1);
    return 0; 
}
补充说明
  • 未定义行为的表现是不可预测的,有时候程序可能看起来“正常运行”,但更多时候会崩溃、执行流程混乱,你遇到的“未进入Solve函数”就是这种诡异表现之一。
  • 另外,main函数的返回值建议用0表示正常退出,这是C语言的标准规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:34:08