C++中malloc分配多倍int内存转int指针的赋值合法性疑问
C++ 内存分配相关问题解答
核心原理
C/C++ 中的指针类型仅存储两个关键信息:指向内存块的起始地址、单步偏移的步长,本身并不会记录所指向内存块的总大小,你疑惑的操作合法性本质就来自这个特性。
具体原因拆解
- 你调用
malloc(n * sizeof(int))申请的是连续的n个int大小的内存空间,返回的void*仅记录这块连续内存的起始地址,本身没有步长信息。 - 你将返回值强制转为
int*后,相当于给编译器明确了这个指针的步长为sizeof(int):做p + i运算时,编译器会自动计算为p的起始地址 + i * sizeof(int),刚好指向连续内存中第i个int的起始位置,只要i的取值范围在0~n-1之间,访问的就是你合法申请的内存,对应的读写操作自然是合法的。 - 额外补充:你代码中
p + i、*(p + i)的写法和数组写法p[i]是完全等价的,C/C++中数组名参与运算时会隐式转为首元素指针,和你这里malloc得到的指针使用逻辑完全一致。
C++ 使用注意事项
- C++ 场景下不推荐使用
malloc/free管理动态内存,更建议用new/delete运算符:不需要手动做类型强转,还会自动调用类对象的构造/析构函数,更符合C++的开发规范。 - 你当前的代码没有调用
free(p)释放申请的内存,会产生内存泄漏,实际开发中要注意动态申请的内存用完后必须释放。 - 编译器不会自动检查指针访问是否超出你申请的内存范围,如果
i的取值超过n-1就属于越界访问,是未定义行为,可能导致程序崩溃、读取脏数据等异常问题,需要你自行保证访问范围合法。
内容的提问来源于stack exchange,提问作者Yogi Bear
相关产品推荐
相关产品推荐

