我在一个网站上发现以下代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1 = malloc(4*sizeof(int)); // allocates enough for an array of 4 int
int *p2 = malloc(sizeof(int[4])); // same, naming the type directly
int *p3 = malloc(4*sizeof *p3); // same, without repeating the type name
if(p1) {
for(int n=0; n<4; ++n) // populate the array
p1[n] = n*n;
for(int n=0; n<4; ++n) // print it back out
printf("p1[%d] == %d\n", n, p1[n]);
}
free(p1);
free(p2);
free(p3);
}
输出:
p1 [0] == 0
p1 [1] == 1
p1 [2] == 4
p1 [3] == 9
现在按照上面的代码执行此操作:
#include <stdio.h>
#include <stdlib.h>
#include "Header.h"
int main()
{
int *ip = (int*)malloc(1 * sizeof(int));
ip[0] = 2;
ip[1] = 9;
printf("%d %d",ip[0],ip[1]);
return 0;
}
输出:2 9
那么当我只为单个int分配字节时,我的指针* ip怎么能存储多个int?
答案 0 :(得分:5)
您正在写入超出数组范围的内存。可悲的是,没有编译器对此进行检查,但是有时它可以工作。
注意:这是未定义的行为,在任何情况下都不应使用。
答案 1 :(得分:3)
请记住,ip[1]
等效于*(ip + 1)
,即使ip
指向单个int
而不是{{ 1}} s。
取消引用或写入int
是undefined behavior。尝试在第二个程序的ip[1]
之前添加free(ip)
,然后观察行为。