您好我有一个关于读取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
}
});
});
答案 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()
调用。