我正在编写一个程序来读取文件。
我一直有运行时错误取决于我是否将int i
放在主函数的第三行。
我认为没有理由因为它对我的程序有影响。但确实如此。 那为什么会这样呢? 并且,至少在原则上,我们不应该在任何我们想要的地方声明变量吗?
这是我的代码
得到答案
故事的道德:在使用之前始终初始化指针。
#include <stdio.h>
#include <stdlib.h>
char read_char(FILE ** fp);
int main()
{
char * str;
str = (char *) malloc(sizeof(char));
FILE * f;
// int i <---------Problem here
f = fopen("txt.txt", "r");
*str = read_char(&f);
putchar(*str);
return 0;
}
char read_char(FILE ** fp)
{
char * c;
c = malloc(sizeof(char));
if ((*fp) == NULL)
{
printf("Error accessing file");
exit(0);
}
(*c) = getc((*fp));
return((*c));
}
答案 0 :(得分:1)
永远不要创建指针变量而不将它们设置为NULL。使用:
char* str = NULL;
FILE* f = NULL;
您很快就会发现错误。
回答你的问题是:你正在写入未分配的内存,所以任何事情都可能发生。像这样的奇怪的事情往往是。
作为旁注,这里使用指针毫无意义。使用:
char someChar;
...
someChar = read_char(...
read_char也是如此:
char c;
...
c = getc((*fp));
答案 1 :(得分:1)
您已定义
char * str;
你已经使用它了
*str = read_char(&f);
且str
尚未指向内存空间
*str
表示内存空间中第一个字节的内容(str
指针指向的内容)将填充来自read_char()
函数的返回char值
实际上你所做的是一个未定义的行为。所以添加i定义会给出一种行为。删除i定义给出另一种行为
修复代码后
#include <stdio.h>
#include <stdlib.h>
char read_char(FILE *fp);
int main()
{
char * str = malloc(sizeof(char));
FILE * f;
int i;
f = fopen("txt.txt", "r");
*str = read_char(f);
putchar(*str);
return 0;
}
char read_char(FILE * fp)
{
char c;
if (fp == NULL)
{
printf("Error accessing file");
exit(0);
}
c = getc(fp);
return c;
}
答案 2 :(得分:1)
我评论你的问题:
另外*str = read_char(&f);
错误str
包含您分配到该地址的垃圾地址。
我已更正您的代码:
#include <stdio.h>
#include <stdlib.h>
char* read_char(FILE ** fp);
int main()
{
char *str;
FILE * f;
int i;
f = fopen("txt.txt", "r");
str = read_char(&f);
putchar(*str);
free(str);
printf("\n");
return 0;
}
char* read_char(FILE ** fp)
{
char * c;
c = malloc(sizeof(char));
if ((*fp) == NULL)
{
printf("Error accessing file");
exit(0);
}
(*c) = getc((*fp));
return(c);
}
此外,您不需要int i;
其warning: unused variable ‘i’
。
第二个不会从*c
返回read_char(FILE ** fp)
而是返回地址并分配给str
来执行此操作我已更改read_char(FILE ** fp)
的返回类型:< / p>
char* read_char(FILE ** fp);
此外,您已使用char* read_char(FILE ** fp);
中的malloc动态为read char分配内存,释放main()
中的内存
不是你的代码工作正常:
您的输入文件:
:~$ cat txt.txt
yourname
代码编译并运行:
:~$ gcc code.c -Wall -o code
code.c: In function ‘main’:
code.c:10: warning: unused variable ‘i’
:~$ ./code
y
答案 3 :(得分:0)
半结肠。
int i
应该是
int i;