我是处理指针和内存分配的新手。我不明白我在做什么错。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* i;
printf("Size of i:%d\n",sizeof(i));
i = malloc(5 * sizeof(int));
printf("Size of i:%d\n",sizeof(i));
i[100] = 3;
printf("Impossible i:%d\n",i[100]);
}
我使用gcc file.c
进行编译。据我了解,由于未分配i[100]
,因此不应该编译该文件。相反,我得到一个输出:
Size of i:8
Size of i:8
Impossible i:3
我在这里想念什么?忽略不可能的i
,据我了解,前两行的输出应为
Size of i:8
Size of i:40
根据我的理解,由于未分配i [100],因此不应编译此文件。
仅是undefined behaviour即可越界访问。对于不确定的行为,编译器可能会或可能不会发出诊断信息。语言没有要求。
忽略不可能的我,据我所知前两行应该是
i的大小:8i:40的大小
与数组不同,指针上的sizeof
运算符无法推断其指向的内存块的大小。总是要给出指针的大小,即sizeof(i) == sizeof (int*)
。
没有办法从指针中推论它;您只需要自己跟踪即可。一种方法是将5
值存储在变量中,如果malloc
成功,则知道存在5个int的空间。