这是为什么?
#include<stdio.h>
int** temp;
int main(){
int i, j;
temp = (int**)malloc(5 * 6 * sizeof(int));
for(i = 0; i < 5; ++i)
for(j = 0; j < 6; ++j)
temp[i][j] = i*j;
system("pause");
}
编译通过,可调试的时候为什么告诉我访问违例呢?
temp[i][j] 与 **(temp + i * 6 + j)不是等价的吗?
望高手指教,这个问题一下午了我也没搞明白,偶指针学的太糊涂
问题点数:20、回复次数:6Top
1 楼Trainsp0tting(该用户的昵称因太长已被系统屏蔽!希望大家引以戒!太长是不允许的!像这个名字就太长了,你看,都这么长了)回复于 2005-06-03 20:29:30 得分 0
晕啊,刚才把 temp[i][j] 换成 **(temp + i * 6 + j)也不行,也一样是访问违例Top
2 楼lbing7(向青润老大学习!!!)回复于 2005-06-03 20:38:42 得分 7
动态分配二维数组啊/?
给你一点从网上搜的资料吧!
1.
A (*ga)[n] = new A[m][n];
...
delete []ga;
缺点:n必须是已知
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)
2. A** ga = new A*[m];
for(int i = 0; i < m; i++)
ga[i] = new A[n];
...
for(int i = 0; i < m; i++)
delete []ga[i];
delete []ga;
缺点:非连续储存,程序烦琐,ga为A**类型
优点:调用直观,n可以不是已知
3. A* ga = new A[m*n];
...
delete []ga;
缺点:调用不够直观
优点:连续储存,n可以不是已知
4. vector<vector<A> > ga;
ga.resize(m); //这三行可用可不用
for(int i = 1; i < n; i++) //
ga[i].resize(n); //
...
缺点:非连续储存,调试不够方便,编译速度下降,程序膨胀(实际速度差别不大)
优点:调用直观,自动析构与释放内存,可以调用stl相关函数,动态增长
5. vector<A> ga;
ga.resize(m*n);
方法3,4的结合
6. 2的改进版(Penrose提供,在此感谢)
A** ga = new A*[m];
ga[0] = new A[m*n];
for(int i = 1; i < m; i++)
ga[i] = ga[i-1]+n;
...
delete [] ga[0];
delete [] ga;
缺点:程序烦琐,ga为A**类型
优点:连续储存,调用直观,n可以不是已知
Top
3 楼Trainsp0tting(该用户的昵称因太长已被系统屏蔽!希望大家引以戒!太长是不允许的!像这个名字就太长了,你看,都这么长了)回复于 2005-06-03 21:28:09 得分 0
谢谢楼上的,不过我用的是C啊
还有,我主要是想知道为什么会出现访问违例这种情况Top
4 楼foochow(无聊,灌水......)回复于 2005-06-03 21:43:54 得分 7
temp[i][j] 与 **(temp + i * 6 + j)不是等价的吗?
.................................
int temp[m][n]
int*p=&temp[0][0];
temp[i][j]=*(p+i*n+j);Top
5 楼Trainsp0tting(该用户的昵称因太长已被系统屏蔽!希望大家引以戒!太长是不允许的!像这个名字就太长了,你看,都这么长了)回复于 2005-06-03 22:15:47 得分 0
int temp[m][n]
int*p=&temp[0][0];
temp[i][j]=*(p+i*n+j);
你这个p是int*
而我说的temp是int**,解引用的时候用两个*不是正好吗?Top
6 楼sh5dragon5(Zaknafein)回复于 2005-06-04 16:22:39 得分 6
感觉是不是应该是这样啊
*(*(temp + i * 6) + j)Top




