1

これが私のコードです。「luetut」変数をコメントアウトすると機能します。しかし、次のようにコンパイルすると、プログラムが変数を出力するときにセグメンテーション違反が発生します。これはどういう意味ですか?デバッグ ビルドを作成しようとすると、まったく奇妙なものが表示されます (これとあれの複数の定義)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct rakenne
{
    int luku;
    float liukuluku;
    char* mjono;
}   Rakenne;

int main(int argc, char *argv[])
{
    int luetut = 0;
    Rakenne palikka;
//  Rakenne palikka, *palikkaosoitin;
//  palikkaosoitin = &palikka;

//  while(luetut < 1)
//  {
        printf("Anna luku:\n");
        scanf("%d", &palikka.luku);
//  }   luetut = 0;
//  while(luetut < 1)
//  {
        printf("Anna liukuluku:\n");
        scanf("%f", &palikka.liukuluku);
//  }   luetut = 0;
    printf("Anna merkkijono:\n");
    scanf("%s", palikka.mjono);

    printf("%i\t%.3f\t%s\n", palikka.luku, palikka.liukuluku, palikka.mjono);

    return 0;
}

では、gcc コンパイラが壊れているのでしょうか、それとも何が問題なのですか?

4

2 に答える 2

4
scanf("%s", palikka.mjono);

あなたは何も指摘しなかったmjonoので、それに書き込むことはもちろん違法です-未定義の動作です。このようなことを行うと、異常な動作につながります。プログラムは、明らかな理由もなく「動作」または「失敗」します。


それで、私のgccコンパイラは壊れていますか、それとも何が問題なのですか

使用しているツールが問題であると考えることは、めったに建設的ではありません。

于 2012-09-02T13:55:50.523 に答える
1

cnicutarsの回答を拡張すると、修正は にメモリを割り当てることですpalikka.mjono

このようなもの:

#define SIZE     40   // or whatever you need.
palikka.mjono = malloc( sizeof(char) * SIZE );

その後、freeその記憶を忘れないでください。

free( palikka.mjono ); 

または、文字列の最大サイズがわかっている場合は、構造を次のように定義してください。

typedef struct rakenne
{
    int luku;
    float liukuluku;
    char mjono[SIZE];
}   Rakenne;
于 2012-09-02T16:46:20.017 に答える