首页 问题❓

代码:

#include"utils.h"
#include<iostream>
using namespace std;

void calMinDis()
{
    bool **_map = NULL;
    int **_min_dis;
    int _height = 100;
    int _width = 200;

    _map = new bool*[_height];
    for (size_t i = 0; i < _height; i++)
    {
        _map[i] = new bool[_width];
    }

    printf("cal min dis.\n");
    if (_map == NULL)
    {
        printf("map haven't init.\n");
        return;
    }

    _min_dis = new int *[_height];
    for (size_t i = 0; i < _height; i++)
    {
        _min_dis[i] = new int[_width];
    }
    int MAX_INT = 0xffffffff >> 1;
    for (size_t i = 0; i < _height; i++)
    {
        for (size_t j = 0; j < _width; j++)
        {
            if (_map[i][j])
            {
                _min_dis[i][j] = MAX_INT;
            }
            else
            {
                _min_dis[i][j] = 0;
            }
        }
    }
    for (size_t i = 0; i < _height; i++)
    {
        for (size_t j = 0; j < _width; j++)
        {
            if (!_map[i][j])
            {
                continue;
            }
            if (i > 0 && _min_dis[i - 1][j] < _min_dis[i][j])
            {
                _min_dis[i][j] = _min_dis[i - 1][j] + 1;
            }
            if (j > 0 && _min_dis[i][j - 1] < _min_dis[i][j])
            {
                _min_dis[i][j] = _min_dis[i][j - 1] + 1;
            }
        }
    }
    printf("1\n");
    for (size_t i = _height - 1; i >= 0; i--)
    {
        for (size_t j = _width - 1; j >= 0; j--)
        {
            printf("(%d,%d)\n",i,j);
            if (!_map[i][j])
            {
                continue;
            }
            if (i + 1 < _height && _min_dis[i + 1][j] < _min_dis[i][j])
            {
                _min_dis[i][j] = _min_dis[i + 1][j] + 1;
            }
            if (j + 1 < _width && _min_dis[i][j + 1] < _min_dis[i][j])
            {
                _min_dis[i][j] = _min_dis[i][j + 1] + 1;
            }
        }
    }
    printf("finished cal min dis.\n");
}

int main(int argc, char const *argv[])
{
    calMinDis();
    return 0;
}

这段代码看起来没什么问题,实则隐藏了很大的坑,因为for (size_t i = _height - 1; i >= 0; i--)这个循环中使用了size_t,加上输出之后会发现,循环停不下来,直至出现segmentation fault;
这是因为size_t是一种非负类型,它永远都不可能会小于0,所以循环停不下来。把size_t改成int就没问题了。




文章评论

    站元素主机 访客FireFoxWindows
    2021-07-17 10:49   回复

    感谢分享 赞一个

    Aoang 访客ChromeWindows
    2021-04-24 16:41   回复

    size_t 是一个 unsigned int。c 的标准库这么做是为了代码的可移植性。

    sizeof strlen() 在不同的编译器下的返回类型不一定相同,用 size_t 可以在所有的标准 c 语言中提高代码的包容性。

    例如 size_t 在 32 和 64 位系统分别代表 unsigned int、unsigned long

    123 访客ChromeWindows
    2021-04-13 22:06   回复

    221321323123123123123123123123