You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:42:02