-1

これは私のコードです:

 #include<stdio.h>



    struct p{

           char* d;
           };

    typedef struct p* pt;

    int main(){
        pt opt;
        opt=(pt)malloc(sizeof(struct p));

        scanf("%s",(opt->d));


        printf("%s",opt->d);



        getch();

        return 0;

        }

実行するたびに、文字列を受け入れて正常に出力しますが、エラーが発生します。デバッグ時に、セグメンテーション違反があることを示していますが、それがどこにあるかを示していませんか? 何が問題なのか、それはかなり正しいようです。

4

5 に答える 5

2

以前mallocは構造体にスペースを割り当てていましたが、読み込みたい文字列には割り当てていませんでした。それも行う必要があります。あなたの質問から言い換えた例を次に示します。

 pt opt = malloc(sizeof(struct p));
 opt->d = malloc(MAX_STRING_LENGTH);
于 2013-04-27T19:19:10.727 に答える
2

うん、問題は、メモリを割り当てる必要があることですchar * d;

1)同様のメモリを割り当てましたchar * d(上記の返信で言及)
opt->d = malloc(expected_max_len + 1);

2) または、構造体の最大バッファ長でバッファを宣言できます。
char d[MAX_LENGTH];

于 2013-04-27T20:30:51.967 に答える
1

scanf は、スキャンされた文字列を char バッファーに入れます。しかし、あなたのコードでは、あなたのcharポインタはバッファを指すべきものを指していません

gcc> 2.7 の場合は、"%ms". これにより、scanf がポインタにメモリを割り当てることができます

scanf("%ms",(opt->d));
于 2013-04-27T19:19:48.373 に答える
0

メモリを割り当てる必要がありますchar* d;

int main(){
    pt opt;
    opt=(pt)malloc(sizeof(struct p));
    opt->d = malloc( sizeof( char )* 80);
    scanf("%s",(opt->d));    //this might overflow
于 2013-04-27T19:18:46.913 に答える
0

scanfどこかへのポインターだけでなく、正しいバッファーを渡す必要があります。

struct p{
   char* d;
};

typedef struct p* pt;

int main(){
    pt opt;
    opt=(pt)malloc(sizeof(struct p));

    opt->d = malloc(expected_max_len + 1);

    scanf("%s",(opt->d));


    printf("%s",opt->d);

    free(opt->d);


    getch();

    return 0;

}
于 2013-04-27T19:19:27.963 に答える