C 使用指针更改矩阵
在我们的c课程中,老师给了我们一个小项目来构建一个Reversi游戏。我在建立董事会方面遇到了困难C 使用指针更改矩阵,c,arrays,pointers,matrix,reversi,C,Arrays,Pointers,Matrix,Reversi,在我们的c课程中,老师给了我们一个小项目来构建一个Reversi游戏。我在建立董事会方面遇到了困难 #define Size 8 int main() { char Board[Size][Size] = { {" "} }; resetBoard(Board); printBoard(Board); printf("\n"); getch(); } void resetBoard(int** board) { for (size_t i = 0;
#define Size 8
int main()
{
char Board[Size][Size] = { {" "} };
resetBoard(Board);
printBoard(Board);
printf("\n");
getch();
}
void resetBoard(int** board)
{
for (size_t i = 0; i < Size; i++)
{
for (size_t j = 0; j < Size; j++)
{
*(board + (i * Size + j)) = 'x';
}
}
}
void printBoard(int board[Size][Size])
{
for (size_t i = 0; i < Size; i++)
{
for (size_t j = 0; j < Size; j++)
{
printf("%c", board[i][j]);
printf(" ");
}
printf("\n");
}
}
我检查了程序,程序得到:
运行时检查失败2-变量“Board”周围的堆栈已损坏
当它更改第三行的第一个X时。
例如,如果我将程序运行到2d第16行的末尾,
我不会遇到这个错误。我认为,将板卡初始化为char类型以及在函数中使用int类型的指针和数组可能会有问题。Char的大小为1字节,int的大小更大,这取决于平台,大多数情况下为4字节。这将导致在阵列上进行操作和循环时出现内存问题
在您的例子中,由于使用了int类型的指针,看起来您在两行之后循环了整个分配内存。在您的例子中,int可能比char大4倍,从而使char类型的整个数据结构的循环速度比您预期的快4倍。您的代码中出现了一系列错误。请参阅内联注释
//Use all capitals for defines
#define BOARD_SIZE 8
//Just reset the whole array to spaces.. No need to traverse byte by byte.
void resetBoard(char* board) {
//memset version
//memset(board, ' ', (BOARD_SIZE*BOARD_SIZE)*sizeof(char));
//non memset version
for (int i=0; i<(BOARD_SIZE*BOARD_SIZE); i++) *board++='x';
}
void printBoard(char *board) {
for (int i = 0; i < BOARD_SIZE; i++){
for (int j = 0; j < BOARD_SIZE; j++){
//Access the 2D array like this (y * width of array + x)
printf("%c", board[i*BOARD_SIZE+j]);
printf(" ");
}
printf("\n");
}
}
//Don't start a name using capitals.. Later when you program c++ or similar you will understand :-)
int main()
{
//This is a more dynamic memory model and is not allocated on the stack.. (free when done!!)
char *board=(char*)malloc(BOARD_SIZE*BOARD_SIZE);
//there are several ways of working with arrays.. No need to complicate stuff if not needed.
//Just point out the first byte of the array.. (See the methods takes a char pointer and that is what's passed the methods)
if (board) {
resetBoard(board);
//Test to see if it works
board[1*BOARD_SIZE+2]='0';
printBoard(board);
free(board);
} else {
printf("Out of memory!\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
或者像2020年一样炫耀它
#define B 16 //Define the size of the 2d matrix
void printMatrix(char*b){for(int i=-1;i<B*B-1;(++i+1)%B?printf("%c ",b[i%B*B+i/B]):printf("%c\n",b[i%B*B+i/B])){}} //Print the 2d matrix
int main(){
char b[B*B]={[0 ...B*B-1]='x'}; //Reserve the 2d matrix space and set all entries to 'x'
printMatrix(&b[0]); //pass the pointer to the print 2d matrix method
return 0; //Done!
}
或2021年二维阵列
#define B 32
void p(char b[B][B]){for(int i=-1;i<B*B-1;(++i+1)%B?printf("%c ",b[i%B][i/B]):printf("%c\n",b[i%B][i/B])){}}
int main(){
char b[B][B]={[0 ...B-1][0 ...B-1]='x'};
p(&b[0]);
}
@罗特海宁。你的代码有很多缺陷。贝娄是一个重新整理你的例子的例子。也许,它会让你了解如何提高工作效率:
#include<stdio.h>
#define Size 8
void resetBoard(char board[][Size]);
void printBoard(char board[][Size]);
int main()
{
char Board[Size][Size];
resetBoard(Board);
printBoard(Board);
printf("\n");
return 0;
}
void resetBoard(char board[][Size])
{
for (size_t i = 0; i < Size; i++)
{
for (size_t j = 0; j < Size; j++)
{
board[i][j] = 'x';
}
}
}
void printBoard(char board[][Size])
{
for (size_t i = 0; i < Size; i++)
{
for (size_t j = 0; j < Size; j++)
{
printf("%c ", board[i][j]);
printf(" ");
}
printf("\n");
}
}
执行结果如下:
./a.out
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
./a.out
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
我希望你能从这里找到灵感。以下是我先前建议的指针版本:
#include<stdio.h>
#include<stdlib.h>
#define Size 8
void resetBoard(char *board, int size);
void printBoard(char *board, int size);
int main()
{
char *Board = (char *)malloc(Size*Size*sizeof(char));
resetBoard(Board, Size);
printBoard(Board, Size);
printf("\n");
free(Board);
return 0;
}
void resetBoard(char *board, int size)
{
for (size_t i = 0; i < size; i++)
{
for (size_t j = 0; j < size; j++)
{
*(board +i*size + j) = 'x';
}
}
}
void printBoard(char *board, int size)
{
for (size_t i = 0; i < size; i++)
{
for (size_t j = 0; j < size; j++)
{
printf("%c ", *(board +i*size + j));
}
printf("\n");
}
}
执行结果如下:
./a.out
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
./a.out
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
x x x x x x x x
编译时,您是否收到任何警告?你应该这样做,重要的是你要阅读并修正它们。好的,这就是答案。谢谢,我没有注意:现在我已经更改了类型,似乎我的重置板功能有问题。介意帮我吗似乎您忘记了在内部循环中使用一个*before board变量。它应该是这样的:*board+i*Size+j='x';因为你的板变量是指针对指针的类型。嘿,谢谢你的帮助。我不小心在函数上使用了错误的类型,正如Jakub所说:@AndersCedronius非常感谢!!她帮助了我。我们还没有学习memset func,所以如果可以的话,我很乐意为您提供一个解释,或者其他方法it@RotemHeinigmemset基本上是这样工作的。。。memset a_指针、_值_to_set、字节数_to_set。只需在终端中写入“man memset”即可获得更多详细信息。memsetvoid*b,内部c,尺寸长度;说明memset函数将值c转换为无符号字符的len字节写入字符串b。值得注意的是,当您使用malloc或memset之类的函数分配数据结构时,它是在内存的堆部分分配的。如果像以前一样使用数组的静态分配:charboard[Size][Size]={{};-它被分配到堆栈内存中。@JakubHubert和RotemHeinig。。。添加了一个memset替代方案,如果你想要一个更动态的内存分配模型。嘿,伙计,谢谢你的回答。正如老师所说,这个练习的答案应该是带指针的。谢谢你的帮助!谢谢你,伙计!非常感谢。