0
#include<stdio.h>   
int main()  
{    
    char *arg[10],*c;  
    int count=0;  
    FILE *fp,*fq;  
    printf("Name of the file:");  
    scanf("%s",arg[1]);  
    fp=fopen(arg[1],"w");  
    printf("\t\t%s",arg[1]);  
    printf("Input the text into the file\n");  
    printf("Press Ctrl+d to the stop\n");  
    while((*c=getchar())!=EOF)  
    {  
            fwrite(c,sizeof(char),1,fp);  
            count++;  
    }  
    return 0;  
}  
4

4 に答える 4

3

この行を変更

char *arg[10],*c;

char arg[1000],c;

この行

scanf("%s",arg[1]);  

scanf("%s",arg);  

そして、この行

while((*c=getchar())!=EOF)

while((c=getchar())!=EOF)

説明:

char *c;はキャラクターではありません。文字へのポインタです。メモリのランダムなビットを指すだけで始まります。これは、ランダムなデータで満たされることがよくあります-最近そこに書き込まれたものは何でも。

char c; キャラクターです

についても同様ですchar *arg[10]。これは 10 個のポインターの配列です。これらは、ランダム データで満たされたランダム メモリを指します。

注: 私の変更はベスト プラクティスではありません。誰かが 1000 文字以上の長さのファイル名を入力した場合、argバッファの末尾を上書きします。何をしているかによっては、これはセキュリティ バグである可能性があります。

于 2011-04-16T14:27:38.160 に答える
1

char *arg[10];

char への 10 個のポインターの配列を定義しますが、その要素を初期化しません。arg[0]、arg[1]、...、arg[9] はすべて未定義の値になります。

次に、これらの未定義の値の 1 つに文字列を入力しようとします。幸運なことに、セグメンテーション違反が発生しました。運が悪ければ、プログラムが代わりにハードディスクをフォーマットする可能性があります。

于 2011-04-16T14:28:47.597 に答える
1
char *arg[10] ;

argchar ポインターの配列です。入力を取得する前に、を使用してメモリの場所を割り当てる必要がありmallocます-

scanf("%s",arg[1]); // arg[1] is not assigned to point to any memory location
                    // and is what causing the segmentation fault.

そうする -

arg[1] = malloc( stringLengthExpectedToEnter + 1 ) ; // +1 for termination character

残りの配列要素でも同じようにする必要があります (または) に変更char*arg[10]char arg[10]て、必ず 9 文字のみを入力してください。


ポインタ通常の変数を混同していると思います。

int *ptr;

ptr整数変数のアドレスを保持できる変数です。ptr整数アドレスを保持するために変数にメモリが割り当てられます。それでおしまい。ptrは初期化されていない状態にあり、ガベージを指している可能性のある場所を指していません。初期化されていないポインターの動作を逆参照することは未定義であり、それによってsegmentation-faultが発生する場合は幸運です。

ここで、 を使用して有効なメモリ位置を割り当てる必要がありますmalloc

ptr = malloc( sizeof(int) ) ; // Allocates number of bytes required to hold an
                              // integer and returns it's address.

そのptrため、整数を保持できる空きストアから取得したメモリ位置を指しています。フリーストアから取得したそのような場所は、 を使用して解放する必要があります。そうしないと、メモリリークfreeの古典的な問題が発生します。宣言中にポインターをNULLに初期化することをお勧めします。

int *ptr = NULL ;

それが役に立てば幸い !

scanf("%d", ptr) ; // Notice that & is not required before ptr. Because ptr 
                   // content is address itself.

通常の可変ストーリーはまったく異なります。宣言されたとき -

int var ;

var整数を保持するためにメモリが割り当てられます。したがって、整数を直接割り当てることができます。

于 2011-04-16T14:27:06.187 に答える
0
#include<stdio.h>   
int main()  
{    
   char arg[10],c;  
   int count=0;  
   FILE *fp;  
   printf("Name of the file:");  
   scanf("%s",arg);  
   fp=fopen(arg,"w");  
   printf("\t\t%s",arg);  
   printf("Input the text into the file\n");  
   printf("Press Ctrl+d to the stop\n");  
   while((c=getchar())!=EOF)  
   {  
        fwrite(&c,sizeof(char),1,fp);  
        count++;  
   }

   if(fp != NULL){
      fclose(fp);
      fp = NULL;
   }
   return 0;  
}  
于 2012-10-19T19:55:57.127 に答える