我正在编写一个代码来处理二维char数组。
char *board[] = {"aa"};
我将数组传递给函数
search(board, row, col);
..........
bool search(char** boards, int row, int col)
{
// Inside the function, I want to modify the boards[x][y]
// from the board within x and y, x < row, y < col
// I get the segmentation fault here because the boards is
// allocated to the static memory and cannot be changed.
boards[x][y] = 'c';
}
在C ++中,我可以使用
vector< vector<char> boards
更改特定位置的元素。 但在C中,没有向量。
有人对如何修改电路板2-D阵列有很好的建议吗? 谢谢。
答案 0 :(得分:4)
问题是你正在创建一个指针数组,并将指向ppint的指针设置为字符串常量。字符串常量的内存不可修改,因此写入它会导致分段错误。
将指针数组更改为2D字符数组将解决此问题
char board[][10] = {"aa", "bb"};
答案 1 :(得分:1)
在C中,如果编译器支持变量长度数组,则可以使用它们。
例如
int size_t m = 2;
int size_t n = 3;
char board[m][n] = { "aa", "bb" };
search( m, n, board );
// Add more search code here...
bool search( size_t rows, size_t cols, char board[][cols] );
另一种方法是使用指针数组,其中每个指针指向动态分配的数组,或者数组本身可以动态分配。例如
int size_t m = 2;
int size_t n = 3;
char **board;
board = malloc( m * sizeof( char * ) );
for ( size_t i = 0; i < m; i++ ) board[i] = malloc( n * sizeof( char ) );
strcpy( board[0], "aa" );
strcpy( board[1], "bb" );
search( board, m, n );
//,,,
bool search( char **board, size_t rows, size_t cols );
在这种情况下,当不再需要数组时,你必须释放分配的内存。
至于您获得的分段错误,那么您正在尝试更改字符串文字。他们是不变的。任何修改字符串文字的尝试都会导致未定义的行为。
答案 2 :(得分:0)
尝试将板声明为2D阵列, char board [10] [10]
同时更改搜索功能声明以将board用作2D数组,如:
搜索(char board [] [],int x,int y){...
我认为您的代码失败了,因为您将指针数组与一个期望指针指向char的参数混合在一起。
问候