声明错误c

时间:2013-01-18 14:40:38

标签: c pointers declaration

我正在编写一个程序来读取文件。 我一直有运行时错误取决于我是否将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 个答案:

答案 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;