利用二维指针创建动态二维数组;
输入只取下三角
在复制时出现问题
问题1:
a=(int **)malloc(n*n);
b=(int **)malloc(n*n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
scanf("%d",(int *)a+i*n+j);
}
}
memcpy(b,a,n*n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ",*((int *)a+i*n+j));
}
printf("\n");
当n=2时,即位2x2的数组,给a输入,先输出a的地址
1
2 2
5265520 5265524
5265528 5265532
a的值
1 0 //为方便查看,三角外的随机数不关注
2 2
将输出代码改成
printf("%d ",(int *)b+i*n+j);
printf("%d ",*((int *)b+i*n+j));
地址及值为
3168400 3168404
3168408 3168412
1 0
8847704 0
自己摸索将
memcpy(b,a,n*n*sizeof(int));
此时n=2正常,n=3程序停止工作。
问题2:地址重叠
1
2 2
3 3 3
**3102864** 3102868 3102872 //数组b的地址
3102876 3102880 3102884
3102888 3102892 3102896
3102832 3102836 3102840 //数组a的地址
3102844 3102848 3102852
3102856 3102860 **3102864**
可见a的最后一个与b的第一个相同,然后打印a,b
1
2 2
3 3 1
1
0 1127968361
1781972340 45186 4747328
原a的值受影响,b问题同问题1
改成memmove依然没用。
感觉是哪里漏了基础的毛病
求解答
for (int j = 0; j <= i; j++)
为何是j<=i呢?不应该是j<n么?
你输入的数据不够,导致再输出时 for (int j = 0; j <n; j++)会输出没有初始化的数组元素,自然就是乱码了
这设计看着好不正常!二维数组的指针用法不是这样的吧?看着好乱。还有你是不是忘了 整形的大小?
malloc(n*n*sizeof(int));