c - 将矩阵的行数重新分配为大于初始值的数字
问题描述
我有一个程序来创建一个具有初始值的矩阵,然后将矩阵更改为给定值。但是当我尝试将行数更改为等于或大于初始值的数字时,程序崩溃了。我在这里做错了什么?
void fill(int row, int column, int **arr){
int k = 0;
for(int i = 0; i < row; i++){
for(int j = 0; j < column; j++){
*(*(arr + i)+j) = k;
k++;}}}
void print(int row, int column, int **arr){
for(int i = 0; i < row; i++){
for(int j = 0; j < column; j++){
printf("%d\t", *(*(arr +i ) + j));}
printf("\n");}}
int **create(int row, int column){
int **arr = (int **)malloc(row * sizeof(int *));
for (int i=0; i<row; i++){
*(arr + i) = (int *)malloc(column * sizeof(int));}
return arr;}
int** modify(int oldRowCount, int row, int column, int **arr){
arr =(int **) realloc(arr,(unsigned long) row * sizeof (int **));
for(int i = 0; i < row; i++)
*(arr + i) =(int *) realloc(*(arr+i),(unsigned long) column * sizeof (int));
if(oldRowCount <= row){
for (int i = oldRowCount; i < row; i++)
*(arr + i) = (int *)malloc(column * sizeof(int));
}
else{
for(int i = row + 1; i <= oldRowCount; i++)
free(*(arr + i));
}
return arr;}
int main()
{
int row = 4;
int column = 4;
int oldRowCount=row;
int **arr = create(row,column);
fill(row, column, arr);
print(row, column, arr);
while(1){
oldRowCount = row;
scanf("%d",&row);
scanf("%d",&column);
arr = modify(oldRowCount, row, column, arr);
fill(row, column, arr);
print(row, column, arr);
}
return 0;
}
解决方案
它继续,因为 realloc() 尝试 realloc 空内存。例如,如果新行数 = 6,那么当 i = 4 时,realloc 尝试将 realloc 指针指向无处。在这种情况下,arr 也应该通过引用来接受。
void modify(int row, int column, int oldRowCount, int** &arr) {
arr = (int **)realloc(arr, row * sizeof(int*));
for (int i = 0; i < oldRowCount; i++) {
*(arr + i) = (int *)realloc(*(arr + i), column * sizeof(int));
}
for (int i = oldRowCount; i < row; i++) {
*(arr + i) = (int *)malloc(column * sizeof(int));
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
*(*(arr + i) + j) = 0;
}
}
}
推荐阅读
- algorithm - 寻找算法时间复杂度的问题规模和输入预处理成本
- scripting - 不要 lint node_modules
- node.js - 无法在谷歌云功能中调试 Puppeteer 超时
- r - 使用 dplyr 对多个帐户进行分组
- javascript - 具有初始值的 Typescript Map 类构造函数不接受 2 种不同类型
- javascript - 在 100% 客户端网站 (JavaScript) 上隐藏令牌
- python - 我的递归函数似乎是使用原始列表而不是在 python 中创建一个新列表
- javascript - React Native - 多选将类组件转换为功能组件
- embedded - 更改函数调用的位置会中断 uart 上的通信
- php - 雄辩的 whereDate 子句使用日期值作为列