C 我的程序在调试器中运行良好,但在发行版中没有

C 我的程序在调试器中运行良好,但在发行版中没有,c,C,关键是,我真的试图寻找答案,但没有人有像我这样的问题。我有一个查找项目的函数 const char *FindItem(int id) { FILE *f1; f1 = fopen("Items.txt", "r"); int i = 0; char s1[256]; while (1) { fscanf(f1, "%i", &i); if (i == id) { fgetc(f1);

关键是,我真的试图寻找答案,但没有人有像我这样的问题。我有一个查找项目的函数

const char *FindItem(int id) {
    FILE *f1;
    f1 = fopen("Items.txt", "r");
    int i = 0;
    char s1[256];
    while (1) {
        fscanf(f1, "%i", &i);
        if (i == id) {
            fgetc(f1);
            fgets(s1, 256, f1);
            fclose(f1);
            return s1;
        }
        fgets(s1, 256, f1);
    }
}
main
中,我写了

int main() {
    printf("%s", FindItem(2));
}
在调试器中,它显示它应该显示的内容,但在发布模式中,它显示两个相同的随机字符
r?
。谁能告诉我有什么问题吗

const char * FindItem(int id)
返回指向
char
的指针

  return s1; 
从函数向调用者返回
s1
的第一个元素的地址

不过,函数
FindItem()
返回
s1
的那一刻已经过去了,因为它只存在于函数的本地堆栈上,只存在于
FindItem()
的活动时间内

所以

尝试打印由返回的
FindItem()
指向的数据,尽管数据已丢失,因为函数已返回

要解决此问题,请在调用方定义要读入的缓冲区,并将其第一个元素的地址传递给函数:

char * FindItem(char * s1, int id)
{
    FILE *f1;
    f1 = fopen("Items.txt", "r");
    int i = 0;

    while(1)
    {
      ...


int main(void)
{
  char s1[256];
  printf("%s", FindItem(s1, 2));
}

您的代码中存在多个问题:

  • 您不需要测试
    fopen()
    打开文件是否成功。如果无法打开
    Items.txt
    ,则有未定义的行为
  • 返回指向本地数组的指针
    s1
    。正如您所观察到的,在函数返回后访问此对象具有未定义的行为。未定义的行为可能是实际的预期行为或其他任何行为。。。它可能会根据执行环境(调试与生产)或任何原因而改变
  • 您不需要测试
    fscanf()
    的返回值:如果在文件中找不到该数字,循环将永远继续
以下是更正的版本:

#include <stdio.h>

char *FindItem(char *dest, int id) {
    FILE *f1;
    int i, c;

    f1 = fopen("Items.txt", "r");
    if (f1 == NULL)
        return NULL;

    while (fscanf(f1, "%i", &i) == 1) {
        if (i == id) {
            if ((c = fgetc(f1)) == EOF || c == '\n' || fgets(dest, 256, f1) == NULL) {
                *dest = '\0';
            }
            fclose(f1);
            return dest;
        }
        if (fgets(dest, 256, f1) == NULL)
            break;
    }
    fclose(f1);
    return NULL;  /* not found */
}

int main(void) {
    char s1[256];
    if (FindItem(s1, 2)) {
        printf("%s", s1);
        return 0;
    } else {
        printf("not found\n");
        return 1;
    }
}
#包括
char*FindItem(char*dest,int-id){
文件*f1;
int i,c;
f1=fopen(“Items.txt”、“r”);
如果(f1==NULL)
返回NULL;
而(fscanf(f1,%i,&i)==1){
如果(i==id){
如果((c=fgetc(f1))==EOF | | c='\n'| | fgets(dest,256,f1)==NULL){
*dest='\0';
}
fclose(f1);
返回目的地;
}
if(fgets(dest,256,f1)==NULL)
打破
}
fclose(f1);
返回NULL;/*未找到*/
}
内部主(空){
字符s1[256];
if(FindItem(s1,2)){
printf(“%s”,s1);
返回0;
}否则{
printf(“未找到”);
返回1;
}
}

您的函数缺少一个
返回
->未定义的行为。。。即使有
返回s1
,也可能是未定义的行为(由于返回本地地址)。每个人在某个阶段都有这个问题。补救措施无特定顺序:1。更新至最新的稳定编译器版本2。启用编译器警告并将其视为错误3。使用运行时检查程序,如valgrind、libasan、Liubsan。它已经返回,但感谢各位,我现在可以尝试找到解决方案(当我知道问题是什么时)
#include <stdio.h>

char *FindItem(char *dest, int id) {
    FILE *f1;
    int i, c;

    f1 = fopen("Items.txt", "r");
    if (f1 == NULL)
        return NULL;

    while (fscanf(f1, "%i", &i) == 1) {
        if (i == id) {
            if ((c = fgetc(f1)) == EOF || c == '\n' || fgets(dest, 256, f1) == NULL) {
                *dest = '\0';
            }
            fclose(f1);
            return dest;
        }
        if (fgets(dest, 256, f1) == NULL)
            break;
    }
    fclose(f1);
    return NULL;  /* not found */
}

int main(void) {
    char s1[256];
    if (FindItem(s1, 2)) {
        printf("%s", s1);
        return 0;
    } else {
        printf("not found\n");
        return 1;
    }
}