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
相关产品推荐
相关产品推荐

