2016-04-02 9 views
-3

だから、私はこのプログラムを書いたが、ヒープバッファオーバーフローの問題を言っているメッセージがたくさんある。私はグラムで入力したときしかし、私は「誰が助けてくださいすることができますtは、問題を参照してください。 ここでコードは、オーバーフローが起こることができます(任意の整数)(任意の整数)ヒープバッファのオーバーフローがC

char **ptr; 
void setmine(); 

/* create a minefield 
**/ 
void setmine(int width , int height) { 
    ptr = (char **)malloc(sizeof(char)*height); 

    for (int i = 0; i < height; i++) { 
     ptr[i] = (char *)malloc(sizeof(char)*width); 
    } 

} 


int main(void) { 
    char line1[20]; 
    char command1; 
    int width, height; 
    fgets(line1,20,stdin); 
    sscanf(line1,"%c %d %d",&command1, &width, &height); 

    if(command1=='g'){ 
     setmine(width, height); 
    } 

    else{ 
     printf("error"); 
     exit(0); 
    } 


    char line2[20]; 
    char command2; 
    int column, row; 
    fgets(line2,20,stdin); 
    sscanf("%c %d %d", &command2, &column, &row); 
    if(command2=='g'){ 
     printf("error"); 
     exit(0); 
    } 
    else if(command2=='b'){ 
     setbomb(column,row); 
    } 
    else if(command2=='u'){ 
     uncover(column,row, width, height); 
    } 
    else if(command2=='f'){ 
     flag(column,row); 
    } 

} 
+1

sscanf( "%c%d%d"、&command2、&column、&row); 'は' sscanf() 'の結果を確認せずに' command2、column、row'を使う前に成功しましたか? – chux

+3

最初に 'sizeof(char *)'または 'sizeof(* ptr)' –

+0

と 'sscanf'戻り値をチェックしないという問題があります。入力が無効だった場合、 'width'、' height'にはゴミが含まれていて、仮想メモリは32ビットシステムとそれ以外のもので使い果たしてしまうでしょう。 –

答えて

2

私はこの上であなたにビットを助けましょう。私は誤解しないでください。また、背後にコメント入れて、コードに

char **ptr; 
// void setmine(); // Parameter were missing here. You don't that anyways, because you defined setmine(int width , int height) before main 

/* create a minefield 
**/ 
void setmine(int width , int height) { 
    ptr = (char **)malloc(sizeof(char*)*height); // Size of pointer to char must be used. 

    for (int i = 0; i < height; i++) { // Now this should work 
     ptr[i] = (char *)malloc(sizeof(char)*width); 
    } 

} 


int main(void) { 
    char line1[20]; 
    char command1; 
    int width, height; 
    fgets(line1,20,stdin); 
    sscanf(line1,"%c %d %d",&command1, &width, &height); 

    if(command1=='g'){ 
     setmine(width, height); 
    } 

    else{ 
     printf("error"); 
     exit(0); 
    } 


    char line2[20]; 
    char command2; 
    int column, row; 
    fgets(line2,20,stdin); 
    sscanf(line2, "%c %d %d", &command2, &column, &row); // Missing line2 
    if(command2=='g'){ 
     printf("error"); 
     exit(0); 
    } 
    else if(command2=='b'){ 
     setbomb(column,row); // No idea how this is called 
    } 
    else if(command2=='u'){ 
     uncover(column,row, width, height); // No idea how this is called 
    } 
    else if(command2=='f'){ 
     flag(column,row); // No idea how this is called 
    } 

} 

をあなたの過ちの一部を固定し、私はあなたがもう少し練習しなければならないと思います。それはCである必要はありますか?私も見ます私はC++がSTLにもたらすメモリ管理テンプレートのおかげで少し楽になったと思う。

+0

私はちょうどCで始まっている、私は私の割り当てをしているので、Cでなければならない。私はここにすべての機能を置いていませんでした。混乱して申し訳ありません。途中でありがとう、あなたはCを実践する良い方法を知っていますか? – cscoding

+0

Hehe、私はそれは大丈夫だと思うが、本当にそれを学びたいなら、テトリスのようなシンプルなビデオゲームを作ろうとする。それは多くの練習を必要としますが、その練習はあなたを強くします。 –

関連する問題