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;
}
}