如果malloc()
返回指向单个内存块的指针,如何使用它连续存储多个值并允许使用下标运算符访问每个值,充当指向数组的指针?
如果我尝试通过下标其地址来更改整数的"第二个元素",则会导致未定义的行为。由于malloc()
返回指向单个内存块的指针,因此它返回的指针不应该引用整个块,因此下标它应该访问内存中它旁边的垃圾值吗?
此外,分配的内存还可用于存储单个值,但不得超过指针强制转换为的类型的大小,而不是分配给的内存块的大小。
这一切是否与指针返回后强制转换为的类型有关?有人可以指出我正确的方向吗?
我想你的误解就在这里:
由于 malloc(( 返回指向单个内存块的指针,它返回的指针不应该引用整个块,因此下标它应该访问内存中它旁边的垃圾值吗?
事实上,如果您执行p = malloc(n)
并且p
具有"指向某种大小n
类型的指针"的类型,那么p[1]
是越界数组访问。但是,通常当您p = malloc(n)
分配数组时,p
的类型不是指向数组(大小为n
(的指针,而是指向数组第一个元素的指针。也就是说,而不是
char (*p)[500] = malloc(500);
是吗:
char *p = malloc(500);
在这种情况下,p[1]
是完全有效的。请注意,对于第一个不寻常的表单,您仍然可以执行(*p)[1]
或p[0][1]
并使其有效。
但要小心,如果您多次使用 malloc,它将返回在堆的不同部分分配的内存。因此,您无法从一个阵列移动到另一个阵列。