如果我只为单个int分配4个字节,那么指针如何存储第二个int?

时间:2019-03-03 20:35:33

标签: c pointers memory malloc

我在一个网站上发现以下代码:

#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?

2 个答案:

答案 0 :(得分:5)

您正在写入超出数组范围的内存。可悲的是,没有编译器对此进行检查,但是有时它可以工作。

注意:这是未定义的行为,在任何情况下都不应使用。

答案 1 :(得分:3)

请记住,ip[1]等效于*(ip + 1),即使ip指向单个int而不是{{ 1}} s。

取消引用或写入intundefined behavior。尝试在第二个程序的ip[1]之前添加free(ip),然后观察行为。