奇怪的内存大小分配问题

richardingding 2010-02-20 12:49:31
代码如下,
int main(int argc, _TCHAR* argv[])
{
float *u_h = 0;
float *f_h = 0;

int ArraySizeX = 1024;
int ArraySizeY = 1024;
int size = ArraySizeX * ArraySizeY * sizeof(int);

u_h = (float*)malloc(size);
f_h = (float*)malloc(size);

float *tmp_u_h, *tmp_f_h;
tmp_u_h = u_h;
tmp_f_h = f_h;

if (u_h == NULL)
{
printf("allocation error");
exit(1);
}
else
printf("+++++%p+++++\n,", u_h);

// if (u_h!=0)
// free(u_h);

if (tmp_u_h == 0)
printf("NULLNULLNULLNULL");

float h = 1.0;

int i = 0;
for (i=0; i<1024*1024; i++)
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}

printf("+++++%p+++++\n,", tmp_u_h);


if (tmp_u_h!=0)
free(tmp_u_h);
free(tmp_f_h);

printf("**********Execuation is done*********!!!\n");
getchar();
return 0;

}

对于循环
for (i=0; i<1024*1024; i++)
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}
如果i<1024或者一个比较小的数字时候,整个代码运行错误,可是如果变成1024×1024就回有内存错误,不能执行free操作。希望高手能够指教,不知道是不是动态分配内存大小有限制呢。我使用的是Linux 64bit的机器。内存8G。
...全文
318 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujiaji 2010-02-20
  • 打赏
  • 举报
回复
帮顶!专接非技术分!
richardingding 2010-02-20
  • 打赏
  • 举报
回复
引用 12 楼 thefirstz 的回复:
引用 10 楼 richardingding 的回复:
引用 8 楼 thefirstz 的回复:你申请的不就是4M内存空间吗?但是指针类型为float,所以要想给这些内容赋值,只能赋到1024*1024才不会越界
非常谢谢你的回帖,只能类型的确是float。请教一下:
int size = ArraySizeX * ArraySizeY * sizeof(float); // int ---> float
你提及的越界是指超过int类型下标的范围了么?如果是的话,是不是意味着动态申请内存空间只能申请到1M呢?非常感谢你!
不是说内存申请只能到1M,可以申请很大(不同操作系统不同),你的4M肯定没问题
你申请了4M的内存,但是访问它的时候要根据指针的类型去访问
给你举个例子,int a[1024*1024] —— 定义了一个整型数组,该数组占用了4M的空间,但是你访问这个数组的时候下标只能从a[0]到a[1024*1024-1],再向后的时候访问就会发生越界,因为每次下标+1,指针就要向后移动4个字节。
所以,你申请了4M的空间,就相当于定义了一个float[1024*1024]的数组,下标也只能到1024*1024-1,否则就是越界访问到了你不能使用的内存,会产生错误

还是非常的谢谢你耐心的帮助我,你的解释我明白了。我把代码改成如下:
for (i=0; i<size/sizeof(float); i++) //修改了 size ---> size/sizeof(float)
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}
同样申请了4M的空间,只是赋值了1024×1024个数据,应该这样理解吧?
昵称很不好取 2010-02-20
  • 打赏
  • 举报
回复
引用 10 楼 richardingding 的回复:
引用 8 楼 thefirstz 的回复:你申请的不就是4M内存空间吗?但是指针类型为float,所以要想给这些内容赋值,只能赋到1024*1024才不会越界
非常谢谢你的回帖,只能类型的确是float。请教一下:
int size = ArraySizeX * ArraySizeY * sizeof(float); // int ---> float
你提及的越界是指超过int类型下标的范围了么?如果是的话,是不是意味着动态申请内存空间只能申请到1M呢?非常感谢你!

不是说内存申请只能到1M,可以申请很大(不同操作系统不同),你的4M肯定没问题
你申请了4M的内存,但是访问它的时候要根据指针的类型去访问
给你举个例子,int a[1024*1024] —— 定义了一个整型数组,该数组占用了4M的空间,但是你访问这个数组的时候下标只能从a[0]到a[1024*1024-1],再向后的时候访问就会发生越界,因为每次下标+1,指针就要向后移动4个字节。
所以,你申请了4M的空间,就相当于定义了一个float[1024*1024]的数组,下标也只能到1024*1024-1,否则就是越界访问到了你不能使用的内存,会产生错误
richardingding 2010-02-20
  • 打赏
  • 举报
回复
引用 9 楼 thefirstz 的回复:
u_h++; 不是表示这个指针加1,而是表示u_h+ sizeof(float),一个++,就是4个字节

谢谢你,这个我注意到了,++之后,我需要移动到下个元素,也就意味着给下个元素赋值。移动的不是一内存地址,是4个字节。
richardingding 2010-02-20
  • 打赏
  • 举报
回复
引用 8 楼 thefirstz 的回复:
你申请的不就是4M内存空间吗?但是指针类型为float,所以要想给这些内容赋值,只能赋到1024*1024才不会越界

非常谢谢你的回帖,只能类型的确是float。请教一下:
int size = ArraySizeX * ArraySizeY * sizeof(float); // int ---> float
你提及的越界是指超过int类型下标的范围了么?如果是的话,是不是意味着动态申请内存空间只能申请到1M呢?非常感谢你!
昵称很不好取 2010-02-20
  • 打赏
  • 举报
回复
u_h++; 不是表示这个指针加1,而是表示u_h+ sizeof(float),一个++,就是4个字节
昵称很不好取 2010-02-20
  • 打赏
  • 举报
回复
你申请的不就是4M内存空间吗?但是指针类型为float,所以要想给这些内容赋值,只能赋到1024*1024才不会越界
richardingding 2010-02-20
  • 打赏
  • 举报
回复
引用 5 楼 thefirstz 的回复:
引用 3 楼 richardingding 的回复:
谢谢楼上的哥们回贴。在循环
for (i=0; i <size; i++)  //1024×1024变成size
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}
这个程序就有错误了。不知道是什么原因,谢谢你啦
不能用size,否则越界了
C/C++ codefor (i=0; i<(size/sizeof(int)); i++)//这样可以{*u_h=3.0;*f_h=4.0;
u_h++;
f_h++;
}

可是如果我想申请4M的内存大小。有其他什么其他的办法么?谢谢你的回帖!
richardingding 2010-02-20
  • 打赏
  • 举报
回复
引用 4 楼 challenge99 的回复:
size = sizeof(int)*1024*1024 , 显然,访问会越界......

size应该表示元素个数,而不是字节数,从你的程序来看,应该是这样的


这里的size我想表达的不是元素个数,我想表达的是这么多元素个数说占用内存的大小。你说的访问越界是表示超出了整型所表示数的大小么?但是对于数组下标我不能用double,有什么好的建议么?谢谢先
昵称很不好取 2010-02-20
  • 打赏
  • 举报
回复
引用 3 楼 richardingding 的回复:
谢谢楼上的哥们回贴。在循环
for (i=0; i <size; i++)  //1024×1024变成size
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}
这个程序就有错误了。不知道是什么原因,谢谢你啦

不能用size,否则越界了
for (i=0; i <(size/sizeof(int)); i++)  //这样可以
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}
challenge99 2010-02-20
  • 打赏
  • 举报
回复
size = sizeof(int)*1024*1024 , 显然,访问会越界......

size应该表示元素个数,而不是字节数,从你的程序来看,应该是这样的
richardingding 2010-02-20
  • 打赏
  • 举报
回复
谢谢楼上的哥们回贴。在循环
for (i=0; i <size; i++) //1024×1024变成size
{
*u_h = 3.0;
*f_h = 4.0;
u_h++;
f_h++;
}
这个程序就有错误了。不知道是什么原因,谢谢你啦
tan870426 2010-02-20
  • 打赏
  • 举报
回复
VS2008 winXP下没错误!

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧