2017-06-11 12 views
0

なぜstrcpy()のこのコードは私にセグメンテーションフォールトを与えますか?私はGNUを使用しており、コードがstrcpyに達すると、セグメンテーション違反で失敗します。なぜこのCコードはstrcpyでセグメンテーションフォルトを取得しますか?

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

void PrintString(char *buff); 
int main() 
{ 
    char *buffPtr = malloc(128); 

    assert(&buffPtr != NULL); 

    memset(&buffPtr, 0, sizeof(buffPtr)); 

    strcpy(buffPtr, "This is my string"); 

    free(buffPtr); 
    return 0; 
} 
+2

'assert(&buffPtr!= NULL); memset(&buffPtr、0、sizeof(buffPtr)); 'は' assert(buffPtr!= NULL)でなければなりません。 memset(buffPtr、0、128); '。また '#include ' – BLUEPIXY

+3

が必要です。あなたのポインタ値をその' memset'で破壊したからです。あなたはそれをゼロで締め付けた。その後、無効なメモリ位置への 'strcpy'を実行すると、そのsegfaultがトリガされました。 – AnT

+3

この 'sizeof(buffPtr)'はあなたがthikした値を返していません –

答えて

6

memsetは、それが指しているメモリの代わりにポインタを上書きします。それがなければならない:

memset(buffPtr, 0, 128); 

私はアンパサンドを除去し、正しいサイズを設定する(sizeof(buffPtr)は、ポインタではなく、割り当てられたサイズの大きさです)。

buffPtr != NULLにアンパサンド(&buffPtrがnullになることはありません)を付けずにチェックするようにアサートを変更する必要があります。 assertを使用しているのは、リリースビルドで何も実行しない可能性があるため、実際には正しくありません。

関連する問題