我的代码怎么可能超过我用 malloc 分配的大小而不给出错误
How is it possible that my code exceeds the size of i allocated with malloc and not give error
我用 malloc 分配了 1 个字节,但我可以在这个数组中放置超过 1 个整数,其中 ptr 指向数组的第一个 element.How 这可能吗?
int main(){
int *ptr = (int*)malloc(sizeof(int));
ptr[1] = 5;
ptr[10] = 12;
printf("%d %d\n",ptr[1], ptr[10]);
}
输出:5 12
I allocate 1 byte with malloc
您没有分配 1 个字节。你分配 1 int
.
but i can put even more than 1 integer in this array
ptr[1] = 5;
ptr[10] = 12;
这叫做未定义的行为。
Dereferencing a pointer that has not yet been definitely initialized
您可以查看此答案,其中列出了 C++ 中最常见的未定义行为,其中一些(包括您的情况)也适用于 C。
C 是一种 low-level 语言,它信任您以确保您编写的代码是安全的。与其他 higher-level 语言不同,在 运行 时间或编译时间没有检查。
请记住,在这种情况下,您已经为一个整数分配了内存(这可能是四个字节而不是 1 个字节。)Malloc 返回一个指针,该指针不包含有关大小的任何信息您分配的区块。
ptr[0] = 5
相当于写
*ptr = 5
请注意,在 C 中,数组的第一个元素是 0 而不是 1。
没有检查 ptr
是否指向有效的内存块。
写的时候也一样
ptr[10] = 5
相当于写作
*(ptr+10) = 5
在此上下文中这是未定义的行为,编译器和 运行time 可以做任何事情,包括产生您想要的结果!
至于这是如何工作的,很可能从中分配整数的堆包含足够的 space 超过分配的 space,您可以写入而不会导致访问冲突。
在真实程序中,space 可能完全未使用,因此没有明显的不良影响(有时),或者它可能被程序中的其他代码或 运行是时候跟踪堆中的分配了。
缺少 运行 时间检查使 C 非常强大和高效,但也使得编写不稳定或不安全的代码变得容易。
我用 malloc 分配了 1 个字节,但我可以在这个数组中放置超过 1 个整数,其中 ptr 指向数组的第一个 element.How 这可能吗?
int main(){
int *ptr = (int*)malloc(sizeof(int));
ptr[1] = 5;
ptr[10] = 12;
printf("%d %d\n",ptr[1], ptr[10]);
}
输出:5 12
I allocate 1 byte with malloc
您没有分配 1 个字节。你分配 1 int
.
but i can put even more than 1 integer in this array
ptr[1] = 5;
ptr[10] = 12;
这叫做未定义的行为。
Dereferencing a pointer that has not yet been definitely initialized
您可以查看此答案,其中列出了 C++ 中最常见的未定义行为,其中一些(包括您的情况)也适用于 C。
C 是一种 low-level 语言,它信任您以确保您编写的代码是安全的。与其他 higher-level 语言不同,在 运行 时间或编译时间没有检查。
请记住,在这种情况下,您已经为一个整数分配了内存(这可能是四个字节而不是 1 个字节。)Malloc 返回一个指针,该指针不包含有关大小的任何信息您分配的区块。
ptr[0] = 5
相当于写
*ptr = 5
请注意,在 C 中,数组的第一个元素是 0 而不是 1。
没有检查 ptr
是否指向有效的内存块。
写的时候也一样
ptr[10] = 5
相当于写作
*(ptr+10) = 5
在此上下文中这是未定义的行为,编译器和 运行time 可以做任何事情,包括产生您想要的结果!
至于这是如何工作的,很可能从中分配整数的堆包含足够的 space 超过分配的 space,您可以写入而不会导致访问冲突。
在真实程序中,space 可能完全未使用,因此没有明显的不良影响(有时),或者它可能被程序中的其他代码或 运行是时候跟踪堆中的分配了。
缺少 运行 时间检查使 C 非常强大和高效,但也使得编写不稳定或不安全的代码变得容易。