读取pgm文件

时间:2016-04-01 14:10:00

标签: c dynamic

您好我有一个关于读取pgm值的底部值的问题。我已经制作了一个2d dyanmic数组,并为高度和宽度添加了2个额外的空格,以便能够创建缓冲区但是当我尝试读取时到第一个整数到宽度+ 1它不起作用。任何线索为什么代码在这里停止?

$('.vote').click(function(e) {
    e.preventDefault();
    var $vote = $(this); // store the element which raised the event here
    $.ajax({
        url: 'foo.php',
        success: function(html) {
            $vote.siblings('.this').html(html); // use siblings() to find .this to change
        }
    });
});

1 个答案:

答案 0 :(得分:0)

您似乎将动态数组指针( board的指示符)与2D数组混淆。这些都不是一回事。请特别注意您为board分配内存,如下所示:

board = (int **)malloc((rows + 2) * sizeof(int *));

分配内存足以保存rows + 2指针int。 (并且请注意,演员阵容是不必要的,并且被许多人认为是糟糕的风格。)然后如何做到这一点......

board=memset(board,0,((columns+2)*(rows+2)));

?除了将结果分配给board这一事实之外,还有什么能让您认为rows + 2 int指针大小的空间必须至少为((columns+2)*(rows+2))个字节? 除非columns非常小,否则您将超越*board的范围,从而产生未定义的行为。

此外,您也可以覆盖刚刚在*board中记录的所有行指针,将它们丢弃,从而泄漏您为行内容分配的所有内存。如果改为此时崩溃,程序继续根据其余代码的C语义执行,然后在尝试取消引用读取循环中的指针时调用更多未定义的行为(board[i][j]=scanned_num)。另请注意,即使board 是一个2D数组,您设置的字节数也不正确,因为每个int都大于一个字节。

这是有意义的,并且更容易将栅格分配为一个大块,如果您使用至少C99,那么最简单的方法是通过可变长度数组:

int board[rows + 2][columns + 2];

memset(board, 0, sizeof(board));

然后你甚至不需要在之后解除分配,但是,出于同样的原因,数组不会在函数执行结束时存活。

如果你需要一些可以从函数返回的东西,那么你可以这样做:

int (*board)[columns + 2];

board = calloc(rows + 2, sizeof(*board));

在这种情况下,calloc()会将分配的空间自动初始化为全零,因此您无需自己执行此操作。

无论哪种方式,它获得所需的空间并用零填充它;没有别的办法来准备接收数据。另请注意,正如在第二种情况下仅使用一个calloc()调用一样,当您完成动态分配的空间时,应该使用一个相应的free()调用。