c中的堆缓冲区溢出

时间:2016-04-02 09:36:13

标签: c malloc overflow

所以我编写了这个程序,但是收到很多消息说堆缓冲区溢出问题。但是,我看不出问题,任何人都可以帮忙。 这是代码,当我输入g(任何整数)(任何整数)

时会发生溢出
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 个答案:

答案 0 :(得分: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吗?我也看到你对mallocs的尝试。由于STL带来的内存管理模板,我认为C ++更容易一些。让我知道......

相关问题