0

次のコードでセグメンテーション エラー (コア ダンプ) が発生しています。

void Update_Log( )
{
        struct logData update;
        int file;

        char *writeBuffer=NULL;

        if((file=creat("/home/user/Desktop/DMS/DMS/filename.txt",O_RDONLY|O_WRONLY))==-1)
                perror("file not opened");
        update.clientName="user";
        update.filename="user";
        update.timestamp="some time";
        sprintf(writeBuffer,"%s %s %s",update.clientName,update.filename,update.timestamp);


        if((write(file,writeBuffer,sizeof(writeBuffer)))==-1)
                perror("write unsuccessful");
        close(file);
}

私の構造は次のとおりです。

struct logData
{
        char *clientName;
        char *filename;
        char *timestamp;
};

誰でもこれを手伝ってもらえますか?

4

7 に答える 7

2

null ポインターを書き込もうとしています。writeBufferそれを array(1) として宣言するか、heap(2) にメモリを割り当てる必要があります。

  1. char writeBuffer[100];
  2. char *writeBuffer=malloc(100)

どちらの場合も を使用すべきではありませんsprintfsnprintf、バッファがオーバーフローしていないことを確認してください。

于 2012-08-20T08:46:27.037 に答える
0

Binyamin Sharet が書いたようsprintfに、出力バッファーを割り当てていません。呼び出し元は、十分な長さの出力バッファーを提供する必要があります。これは必ずしも単純ではありません。fopenそのため、代わりにを使用することをお勧めしますopen。次に、次のようにコーディングできます。

void Update_Log( )  
{  
        struct logData update;  
        FILE *file = fopen("/home/user/Desktop/DMS/DMS/filename.txt", "w");  

        if(file==NULL) {  
                perror("file not opened");  
                return;
        }
        update.clientName="user";  
        update.filename="user";  
        update.timestamp="some time";  
        if(fprintf(file,"%s %s %s",update.clientName,update.filename,update.timestamp) < 0)  
                perror("write unsuccessful");  
        fclose(file);  

}

ご覧のとおり、コードは短く、潜在的なバッファ オーバーフローはありません。

于 2012-08-20T08:57:53.420 に答える
0

「update」が作成されると、文字列 clientName、filename、timestamp のポインター用のスペースのみが割り当てられます。文字列自体にスペースを割り当てるわけではありません。簡単なハックは、 update.clientName = (char*)malloc(sizeof(char)*len) のようなことをすることです。ここで、len は割り当てたい長さです。次に、その呼び出しの戻りコードを実際に確認する必要があります...

これは、書き込みバッファとまったく同じ問題です...すべての文字列にスペースを割り当てることを確認する必要があります。

于 2012-08-20T08:47:54.680 に答える
0

エラーは次の 2 行です。

char *writeBuffer=NULL;

/* ... */

sprintf(writeBuffer, /* ... */);

NULLここでは、ポインタに書き込みます。

代わりに配列を作成します。

char writeBuffer[32];
于 2012-08-20T08:49:12.073 に答える
0

writeBuffer 用のスペースを割り当てる必要があります。

malloc を使用するか、データのサイズに制限がある場合 (たとえば、256 バイト未満の場合) として宣言するだけです。

char writeBuffer[256];

また、sprintf の代わりに snprintf を調べて使用し、データが最後まで流れないようにすることもお勧めします。

于 2012-08-20T08:50:20.570 に答える
0

あなたの構造体はポインタのみを格納し、実際のデータにはメモリが割り当てられません。あなたが持っているべきか

struct logData
{
        char clientName[SOMEDEFINE1NUMBERHERE];
        char filename[SOMEDEFINE2NUMBERHERE];
        char timestamp[SOMEDEFINE3NUMBERHERE];
};

または、メモリを割り当てます ( malloc)

update.clientname = (char *)malloc(SOMEDEFINE1NUMBERHERE); strncpy(update.clientname, "ユーザー");

于 2012-08-20T08:51:19.813 に答える
-1

ですので、クラッシュしwriteBufferますNULL

writeBuffermalloc を使用するためにメモリを割り当てる必要があります。(たとえば) 必要なスペースを計算するために使用します (と のスペースをstrlen忘れないでください)。\0sprintf

または、固定サイズの配列を自動的に割り当てることもできます。

char writeBuffer[ SOME_SIZE_BIG_ENOUGH ];

また、これを行うべきではありません:

    update.clientName="user";
    update.filename="user";
    update.timestamp="some time";

いくつかのオプションがあります:

  • 使用するstrcpy
  • 使用strdup(POSSIX)
  • const char*だけでなく、ポインターを作成しますchar*
于 2012-08-20T08:48:56.473 に答える