C++出现*int无法赋值给int报错,求动态数组指针使用及代码修复方法
现有代码错误梳理
- 内存分配逻辑错误:你声明的
int** mat是二维int指针,对应动态二维数组,需要先分配行维度的指针数组,再为每一行分配列维度的int空间,原代码中new int* [columns];无意义,没有赋值给任何指针,属于无效代码,也没有完成列空间分配。 - 赋值逻辑类型不匹配:
*mat[j] = mat[(rand() % 50) - 50];中,左侧*mat[j]是int类型值,右侧mat[下标]拿到的是int类型的行指针,两者类型不匹配,因此报int无法赋值给int的错误。 - 二维数组访问逻辑错误:没有用到行下标i,仅用j访问行指针会在rows≠columns时出现越界。
- 随机数逻辑异常:未初始化随机种子,每次运行生成的随机序列固定;
(rand() % 50) - 50得到的是[-50, -1]的负数,若需要其他区间可自行调整。
修改后代码(完成随机数组生成功能,可直接扩展反转逻辑)
#include <stdio.h> #include <iostream> #include <stdlib.h> #include <time.h> int main() { int rows; int columns; printf("How many rows do you want?: "); // 非VS环境可将scanf_s替换为scanf scanf_s("%i", &rows); printf("\nHow many columns do you want?: "); scanf_s("%i", &columns); printf("\n"); // 初始化随机种子,保证每次运行随机数不同 srand((unsigned int)time(NULL)); // 第一步:分配行指针数组 int** mat = new int* [rows]; // 第二步:为每一行分配列元素空间 for (int i = 0; i < rows; i++) { mat[i] = new int[columns]; } // 生成随机值并打印 for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { // 生成[-50, 50]的随机int值,直接赋值给对应位置的int元素 mat[i][j] = rand() % 101 - 50; printf("%d\t", mat[i][j]); } printf("\n"); } // 后续实现反转逻辑:可新建同大小的二维数组reverse_mat,赋值逻辑为 reverse_mat[i][j] = mat[rows - 1 - i][columns - 1 - j] // 释放内存,避免泄漏:先释放每一行,再释放行指针数组 for (int i = 0; i < rows; i++) { delete[] mat[i]; } delete[] mat; return 0; }
关键规则说明
- 动态数组分配规则:一维动态数组用
new 类型[大小],返回对应类型的指针;N维动态数组需要逐层分配,从最高维到最低维,释放时顺序相反从最低维到最高维。 - 指针类型对应规则:
int**类型的变量做第一层下标运算后得到int*类型,再做第二层下标运算后得到int类型,和普通二维数组访问规则一致,不会出现类型不匹配问题。
内容的提问来源于stack exchange,提问作者Harl23
相关产品推荐
相关产品推荐

