-1

我正在编写一个程序来读取文件。而且我一直有运行时错误,这取决于我是否放在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));
    }
4

4 回答 4

1

切勿在未将其设置为 NULL 的情况下创建指针变量。采用:

char* str = NULL;
FILE* f = NULL;

你很快就会发现你的错误。

你的问题的答案是:你正在写入未分配的内存,所以任何事情都可能发生。像这样的奇怪的事情经常发生。

作为旁注,在这里使用指针是没有意义的。采用:

char someChar;
...

someChar = read_char(...

read_char 也是如此:

char  c;
...
c = getc((*fp));
于 2013-01-18T14:44:59.583 回答
1

你已经定义了

 char * str;

你已经使用它了

*str = read_char(&f);

并且str尚未指向内存空间

*str意味着内存空间中第一个字节的内容(指针指向的)将用函数str返回的 char 值填充read_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;
}
于 2013-01-18T14:46:43.343 回答
1
于 2013-01-18T15:01:06.393 回答
0

分号。

int i

应该

int i;
于 2013-01-18T14:42:11.533 回答