-1

私はファイルを読むためのプログラムを書いていました。int iまた、main関数の3行目に配置するかどうかによって、ランタイムエラーが発生します。

それが私のプログラムに影響を与える理由はわかりません。しかし、そうです。では、なぜそれが起こっているのでしょうか?そして、少なくとも原則として、私たちが望むところならどこでも変数を宣言することができないはずですか?

これが私のコードです

答えを得た

ストーリーのモラル:ポインターを使用する前に、必ずポインターを初期化してください。

#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
于 2013-01-18T15:01:06.393 に答える
1

あなたが定義した

 char * str;

そしてあなたはそれを使いました

*str = read_char(&f);

strまだメモリ空間を指していない

これ*strは、メモリ空間 (ポインターが指している) の最初のバイトの内容が、関数strから返された char 値で満たされることを意味します。read_char()

実際、あなたがしたことは未定義の動作です。したがって、 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

ポインター変数を 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 に答える
0

セミコロン。

int i

する必要があります

int i;
于 2013-01-18T14:42:11.533 に答える