关于int*和int**
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int row, column;
int **p = NULL;
int i;
int j;
int k = 0;
printf("Please input the row of array:\n");
scanf("%d", &row);
p = (int**) malloc (row * sizeof(int));这行代码是错的
printf("Please input the column of array:\n");
scanf("%d", &column);
for(i = 0; i < row; i++)
{
*(p+i) = (int*) malloc (column * sizeof(int));
}
for(i = 0; i < row; i++)
for(j = 0; j < column; j++)
{
p[i][j] = k;
k++;
}
k = 0;
for(i = 0; i < row; i++)
for(j = 0; j < column; j++)
{
printf("%x", *(p+i)+j);
printf("\n");
}
for(i = 0; i < row; i++)
free(*(p+i));
free(p);
return 0;
}
这段程序是用来动态生成二维数组的,其中有一行代码是错的。我标注出来了,正确的应该是p = (int**) malloc (row * sizeof(int *))我想问的是,为什么在这样的情况下,输入2,3或者3,3比较小的数的时候可以正常运行,可是当输入6,7或者8,9大一点的数就会出现段错误呢? 求解释!
[解决办法]
没用过lniux
看了一遍楼主代码和下面回复
如果lniux下面的int*是占了8个字节的 而int是占了4个字节的话
那么在这行代码
for(i = 0; i < row; i++)
{
*(p+i) = (int*) malloc (column * sizeof(int));
}
发生了内存访问越界
至于你说的为什么(2,2)(2,3)这样的可以运行,而大一点的不可以
那么我就用windows下面的malloc函数说一下
windows下如果我想分配malloc(3*sizeof(int)) 当作你的0,1,2存放的地点的话
那么它的内存情况其实是这样的
001629F8 00 00 00 00 01 00 00 00 02 00 00 00 2D 00 39 00 ..........-.9.
00162A08 B4 C0 DD 3D 6E 66 00 0C 蠢?nf..N
malloc其实是分配了6个字节 前面3个是用来存放数据的,后面2个int型是用来记录内存读写属性(我猜的)和其他相关,有一个int是为了内存对齐
所以如果lniux下程序的内存管理模式与windows下相似的
可以推测
当数小的时候,你溢出的部分其实还是(广义上的)可“用”内存,(只有可能会影响程序的内存回收什么的)而你后面调用的free函数,对无效内存是有识别的,也不会出错(还有种可能就是你的测试次数不够多,只是你碰巧遇到几次成功的)
而如果你使用大的话,那么可以超过这6个字节(windows下),进入其他领域了,破坏更多的东西,所以出错
好了,以上都是我猜得