【发布时间】:2019-11-11 03:55:31
【问题描述】:
如果你们看到下面的代码,没有为 ptr 分配内存(只分配了 0 个字节)。但是ptr[0],ptr[1].....ptr[n]如果没有空间怎么初始化呢。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main(){
int *ptr;
ptr = malloc(0);
ptr[0] = 0;
ptr[1] = 4;
ptr[2] = 3;
printf("%d %d %d",ptr[0],ptr[1],ptr[2]);
}
【问题讨论】:
-
请注意,
main()的正确声明之一是int main(void)(主要替代方法是int main(int argc, char **argv))——请参阅 What shouldmain()return in C and C++。malloc(0)的返回值是实现定义的。它可能是空指针或指向无法合法取消引用(分配)的内存的有效指针。显示的代码不保证会失败,但也不保证可以工作。您使用的malloc()可能会为您的零字节请求分配多达 16 个字节的空间。 -
@Allan:您请求的字节数将可供使用;可能还有更多,但您无法合法访问它们。 (Linux 对过度提交内存有一种奇怪的看法;即使您要求提供荒谬的内存量,当您调用
malloc()时分配也不会失败,但是当您尝试使用它时可能会失败。我一直不明白为什么这是有益的,但这是选择的实现。是的,结果因平台而异,但如果你请求 N 个字节,你应该能够使用 N 个字节,但你不应该尝试使用 N+1 个字节。 -
欢迎来到魔法世界UNDEFINED BAHAVOIUR。任何事情都可能发生,它可能有效或无效,它可能会给你买披萨或将你的银行账户详细信息发送给我。世事皆可能。理智的程序员避免使用 UB,或者至少在他们真正了解实现的情况下使用它们(像我这样的 uC 裸机非常喜欢 :))
-
没有人关心你获得了多少“额外”内存。访问超出您请求的内存是未定义的行为。您的代码从根本上被破坏,没有用处或有趣。
标签: c malloc dynamic-memory-allocation calloc