C 如何设置程序的内存上限

C 如何设置程序的内存上限,c,windows,out-of-memory,C,Windows,Out Of Memory,如何在我的C(或者,原则上,但在本例中不是C++)程序中设置RAM、堆或堆栈使用的上限?我正在Windows 10上使用Visual Studio 我有一个完全可以工作的程序(嗯,是库,还有一个运行基本测试的小程序,并向我正在辅导的人演示),我想展示内存分配失败时会发生什么。(我不只是用一个愚蠢的大分配来做这件事,因为它是链表,我想在这个上下文中显示内存分配失败。)那么:我如何限制我的程序允许使用的内存量,我应该在哪里做呢?我是否会在操作系统中告诉它“我要运行的应用程序只能使用X字节的RAM”(

如何在我的C(或者,原则上,但在本例中不是C++)程序中设置RAM、堆或堆栈使用的上限?我正在Windows 10上使用Visual Studio

我有一个完全可以工作的程序(嗯,是库,还有一个运行基本测试的小程序,并向我正在辅导的人演示),我想展示内存分配失败时会发生什么。(我不只是用一个愚蠢的大分配来做这件事,因为它是链表,我想在这个上下文中显示内存分配失败。)那么:我如何限制我的程序允许使用的内存量,我应该在哪里做呢?我是否会在操作系统中告诉它“我要运行的应用程序只能使用X字节的RAM”(或者甚至可能告诉它限制堆或堆栈大小),我会在编译器参数、链接器参数中做些什么

我所写的代码有一些保护措施,当malloc(或者,在少数地方,calloc)返回NULL时,可以防止非法的内存访问,以及随后的崩溃!所以,不要担心非法的内存访问之类的事情,我对自己正在做的事情有相当好的了解

以下是库标题的内容,
singleLinkList.h

\ifndef SINGLELINKEDLIST\u H
#定义SINGLELINKEDLIST_H
#ifndef类数据
#定义数据类型3
#endif/!数据类型
#包括
#包括
typedef long long LL_t;
#如果数据的种类=1
类型定义浮点数据;
#定义数据表单“%f”
#elif数据的种类=2
typedef双数据;
#定义数据表单“%lf”
#elif数据类型=3
类型定义所有数据;
#定义数据表单“%lld”
#否则
typedef int data_t;
#定义数据表单“%d”
#endif//数据的种类==1、2等。。。
结构列表结构;
//相当于.c文件中的'list_t*'
类型定义结构列表结构*LS\u p;
//相当于.c文件中的'const list_t*const'
typedef const struct list struct*const LS_cpc;
typedef struct listStruct*const LS_pc;
整数显示大小(无效);
尺寸\u t queryNodeSize(空);
//失败时返回NULL
新列表(无效);
//失败时返回NULL(在内存alloc中,在任意点),或者如果给定NULL指针,则返回NULL
LS_p mkListCopy(LS_cpc);
//将一个列表复制到另一个列表中;失败时不修改目标
//返回一个指示成功/失败类型的值;成功时返回0,
//故障时的各种“true”值取决于类型
//1表示简单分配失败
//-1表示您给出了空指针
内部副本列表(LS_pc dst、LS_cpc src);
//销毁(释放)给定的单链接列表(给定的列表,以及其头部所在的所有节点列表)
作废销毁清单(LS_p);
//销毁指向的列表,然后将其设置为NULL
//内联无效列表(LS_p*listP){
内联无效strongDestroyList(结构列表结构**listP){
销毁清单(*listP);
*listP=NULL;
}
//获取指向列表的指针\u t
//返回它有多少个元素(在O(n)时间内运行)
//如果你不明白O(n)time是什么意思,去查“大O符号”
尺寸长度列表(LS\U cpc);
//打印列表;返回打印的字符
内部打印列表(LS\U cpc);
//获取列表指定索引处的数据;在失败时设置输出参数
数据索引数据(LS_pc,常量大小索引,int*const err);
//将ind处的数据写入输出参数
//返回一个指示成功/失败类型的值;成功时返回0,
//故障时的各种“true”值取决于类型
//1表示简单分配失败
//-1表示您给出了空指针
int copyToPointer(LS_pc、常量大小索引、数据常量输出);
//获取指定索引处的数据并将其从列表中删除;在失败时设置输出参数
数据从索引(LS\u pc,常量大小索引,int*const errFlag);
//弹出列表的第一项;设置失败时的输出参数
数据从顶部弹出(LS_pc,int*const errFlag);
//返回一个指示成功/失败类型的值;成功时返回0,
//故障时的各种“true”值取决于类型
//1表示简单分配失败
//-1表示您给出了空指针
int assignToIndex(LS_pc、常量大小ind、常量数据值);
//返回一个指示成功/失败类型的值;成功时返回0,
//故障时的各种“true”值取决于类型
//1表示简单分配失败
//2表示无法达到指定的索引,因为它没有那么长。
//-1表示您给出了空指针
int insertAfterInd(LS\u pc、常量大小\u t ind、常量数据\u t值);
//返回一个指示成功/失败类型的值;成功时返回0,
//故障时的各种“true”值取决于类型
//1表示简单分配失败
//-1表示您给出了空指针
int appendToEnd(LS_pc,const data_t value);
//返回一个指示成功/失败类型的值;成功时返回0,
//故障时的各种“true”值取决于类型
//1表示简单分配失败
//-1表示您给出了空指针
int insertAtStart(LS_pc list,const data_t value);
#endif/!SINGLELINKEDLIST_H
下面是运行演示/测试的
main.c
,看起来像:

英特尔编译器 #pragma警告禁用1786 #否则 #ifdef硕士学位 #定义\u CRT\u安全\u无\u警告1 #endif/\u MSC\u VER #endif/\uU英特尔编译器 #包括“singleLinkList.h” #包括 #包括 void cleanputbuffer(void){ 字符c; 做{ scanf(“%c”、&c); }而(c!='\n'); } 无效填充可用内存(无效){ 大小\u t计数=0; LS_p list=NULL; 尺寸与长度; 数据终端; int err=0; const size_t nSize=queryNodeSize(); printf(“nSize:%zu\n”,nSize); int last=-5; printf(“您是否希望运行涉及填充可用内存的测试?” “(只有“y”将被解释为肯定)=>”; 查尔安斯; scanf(“%c”和“&ans”); cleanInputBuffer(); 如果((ans!='y')&&(ans!='y')){ 公共关系
cl singleLinkList.c -c
cl main.c /Zp4 /link singleLinkList.obj