我对这种语言有点新意,我想到了一些愚蠢但却真的想做的事情。我现在学习C,我想尝试创建一个可以继续创建变量的程序。 像:
while(1) {
//here making variables.
}
我的老师说它将变量存储在一个空的空间中,因为我不保留堆我想要做的是保留大量的变量,直到我拿走所有存储空间并且我的计算机崩溃。这可能吗?
答案 0 :(得分:0)
如果我理解正确,您希望在运行时动态创建命名变量。你不能这样做:命名变量是在编译时创建的,而这就是你所坚持的。
如果要在编译时动态创建这些变量,那么您必须在代码中列出它们。我会选择需要最多字节存储的类型并创建一大堆。因为您应该使用不同的名称创建它们,所以创建代码生成器可能是一个好方法:只需编写一个编写另一个程序的程序。
但是如果你只想花费内存,你可以采取其他方式:声明一个固定大小的数组,并使用最大字节存储的类型使其成为最大的大小。
最后,这似乎非常适合使用堆并不断分配内存。为什么你说你不能使用它?
答案 1 :(得分:0)
标准C无法在程序中创建变量,如果“变量”,我们指的是一个命名对象,除了你可以递归调用具有变量的函数,因此每次调用都会创建新的变量实例(在编译时固定名称。)
要在程序中的C中创建新对象,必须动态分配存储并编写代码来操作它们。以这种方式创建的对象没有名称;它们只存在于存储中,您必须编写代码来进行操作。 (用于引用此存储的指针具有名称,但不会为存储本身创建任何名称。)
在普通的托管环境(在Windows,macOS,Linux等通用操作系统中运行的程序)中,分配过多内存不会导致系统崩溃。操作系统不会给你的程序提供足够的内存以致系统崩溃(除非系统本身有缺陷)。
答案 2 :(得分:0)
如果您正在寻找一个简单的溢出,您可以试试这个。
int main(){
int* i;
while(1){
i = (int*) malloc(sizeof(int));
}
return 0;
}
程序会崩溃,但你的电脑会没问题。
答案 3 :(得分:0)
是的,它被称为内存泄漏。您可以通过定义指针变量并重新初始化它而不首先释放它来创建一个。如果您希望它快速填充空间,请创建一个void*
指针,使用malloc()
初始化它,并在循环中使用合理的大小参数。
然而,现代操作系统稍微有点保护自己,因此您需要将数据写入分配的空间以实际物理分配它。我会使用memset()
。
然后该程序填满整个虚拟地址空间。这最初会导致您的PC慢慢爬行,因为操作系统需要将您的数据分页到硬盘上。这将继续,直到内存和页面文件或交换分区都填满其限制。
最终结果将取决于操作系统的行为。如果它是智能的,它可能会终止你的程序,如果不是它可能会因为缺乏为自己分配的内存空间而崩溃。