2

私は次のcコードを書いていますが、エラーが発生します:

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

int main()
{
char *prot;
char addr[20];
FILE *fp;
int i = 0;
int tos,pld;

prot = (char *)malloc(sizeof(char *));
//addr = (char *)malloc(sizeof(char *));

printf("\n enter the protocol for test::");
scanf(" %s",prot);
printf("\n enter the addr::");
scanf(" %s",addr);
printf("\n enter the length of the payload::");
scanf(" %d",pld);
printf("\n enter the tos :: ");
scanf(" %d",tos);

値の入力中に次のエラーが発生します。セグメンテーションフォールトが発生しています。このセグメントフォールトが発生する理由を誰かに教えてもらえますか。

enter the protocol for test::we

enter the addr::qw

enter the length of the payload::12

Segmentation fault
4

6 に答える 6

5
prot = (char *)malloc(sizeof(char *));

する必要があります:

prot = malloc(sizeof(char) * SIZE); // SIZE is the no. of chars you want

もう1つの問題は次のとおりです。!&の整数にはを使用する必要があります。scanf()

変更あり:

printf("\n enter the length of the payload::");
scanf(" %d",&pld);
printf("\n enter the tos :: ");
scanf(" %d",&tos);
于 2012-04-04T00:27:28.890 に答える
3

セグメンテーション違反は、スキャンされた値が格納される変数へのポインタscanfを予期しているが、変数自体を渡すためです。これは初期化されていないため、ポインタとして解釈すると、野生を指します。同じことが。でも起こります。そしてもちろん、他の方法で指摘されているように、適切な量のスペースを割り当てる必要があります。pldtosprot

于 2012-04-04T00:28:19.497 に答える
3

のメモリ割り当てでprotは、文字列に4バイト(32ビットシステムの場合)または8バイト(64ビットシステムの場合)が割り当てられています。それ以上を読み取ると、バッファがオーバーフローします。

それ以外の理由がない限り、私は単に次のように使用します。

char prot[128];

文字列に適したサイズの場合。

また、すべてのscanf()呼び出しをチェックして、成功することを確認する必要があります。おそらく、文字列のサイズに制限を適用する必要があります。の場合char prot[128];、安全な変換は%127s;です。nullは、変換仕様ではカウントされません。

コンパイラがこれらの行について警告していなかった場合:

scanf(" %d",pld);
scanf(" %d",tos);

より多くの警告をオンにするか、より優れたコンパイラを入手する必要があります。警告が表示された場合は、コンパイラに注意してください。それはあなたよりもCについてもっと知っています(そしておそらく私よりもそれについてもっと知っています)。

scanf(" %d", &pld);
scanf(" %d", &tos);
于 2012-04-04T00:28:41.480 に答える
1

これはおそらく現在の問題の原因ではありませんが、バグです。

prot = (char *)malloc(sizeof(char *));

バッファを1文字のポインタのサイズにするつもりだったのではないかと思います。

とにかく、当面の問題を特定するには、valgrindやデバッガーでプログラムを実行してください。この特定のケースでは、コンパイラの警告を有効にするだけで問題が発生します。つまり、scanfへのポインタを渡す必要がある場所に値で整数を渡すということです。これは、関連するオプションを有効にするだけで、私たちのところに来るのではなく、コンパイラーによって解決された可能性があります。

于 2012-04-04T00:27:19.450 に答える
1

scanf入力している変数へのポインタを期待します(すでにへのポインタである文字列の場合を除くchar)。

試す

scanf(" %d", &pld);

と同じtosです。

于 2012-04-04T00:29:29.827 に答える
0

scanfファミリーの関数は、宿題の問題の主な原因です。

  1. それらは常にアドレスを期待するため、OUTPUTとして使用できます。
  2. その部分のプロトタイプが...であるため、タイプチェックできません。したがって、そこに何でも置くことができます。コンパイラは文句を言いません。

うまくいかない場合は、レシーバー引数を確認してください。これらは、書き込まれるアイテムのアドレスである必要があり、タイプは、フォーマット文字列で指定したものと一致する必要があります。

于 2012-04-04T05:06:02.420 に答える