C++报错:将int*赋值给int [rows]时类型不兼容问题求助
问题解答
核心认知疏漏
1. 混淆了数组指针和指针数组的定义
你代码里写的int(*a)[rows]是数组指针,本质是单个指针,指向长度为rows的int型数组,而不是你需要的「每个元素都是int指针的指针数组」。
此时a[i]等价于*(a + i),类型是int[rows](数组类型),而&(c[i][0])是int*类型,自然会报类型不匹配的赋值错误。
你需要的指针数组定义应该是int *a[rows],每个元素都是int*类型,刚好可以存储二维数组每行的首元素地址。
2. 误用了C++不支持的变长数组特性
C标准不允许用运行时输入的变量作为栈上数组的长度,你写的int c[rows][cols]、int *a[rows]都是C语言的变长数组(VLA)特性,仅属于GCC等编译器的扩展,不符合标准C规范,生产环境建议用动态内存分配实现。
3. 原逻辑中b = a的逻辑是成立的,仅因a的类型定义错误导致无法赋值
指针数组的数组名隐式转换为首个元素的地址,指针数组的元素是int*,所以首个元素的地址就是int**类型,刚好可以赋值给双指针b。
修正后的标准C++代码
#include <iostream> using namespace std; int main() { int rows, cols; cout << "Enter rows "; cin >> rows; cout << "Enter cols "; cin >> cols; // 动态分配二维数组c int** c = new int*[rows]; for(int i=0; i<rows; i++){ c[i] = new int[cols]; } // 动态分配指针数组a int** a = new int*[rows]; int **b = NULL; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << "Enter data element [" << i << "][" << j << "]"; cin >> c[i][j]; } a[i] = &(c[i][0]); // 也可以直接写a[i] = c[i],效果等价 } b = a; // 测试访问(可选) // 例如输出第2行第3个元素:cout << b[1][2] << endl; // 释放内存避免泄漏 for(int i=0; i<rows; i++){ delete[] c[i]; } delete[] c; delete[] a; return 0; }
内容的提问来源于stack exchange,提问作者MathMan
相关产品推荐
相关产品推荐

