Visual Studio 2017中srand()调用崩溃,在线编译器正常,求解决方案
解决Visual Studio 2017中随机函数使用及程序崩溃问题
嘿,我帮你梳理下问题:你的程序崩溃主要不是srand的写法锅,而是两个关键代码问题,加上VS对C标准和类型安全的严格检查导致的,下面一步步搞定:
1. 先搞定time_t类型不匹配导致的栈破坏
你用long t; time(&t);时出现的Run-Time Check Failure #2,本质是VS里time_t的底层类型是64位的__int64,而long是32位整数——time()函数会往&t指向的内存写入64位数据,直接越界覆盖栈上的其他内容,把栈搞坏了自然就崩溃了。
正确的写法必须用time_t类型来接time()的输出,或者直接用简洁的标准写法:
// 写法1:显式定义time_t变量 time_t t; srand((unsigned int)time(&t)); // 写法2:更常用的简洁版 srand((unsigned int)time(NULL));
这里要强转成unsigned int是因为srand的参数要求是这个类型,VS对类型不匹配的检查比在线编译器严得多,不转的话会有警告,甚至可能触发潜在问题。
2. 修复maxB函数的两个致命问题
你的maxB函数有两个大坑:
- 当输入的
n=1时,循环for (int i = 0; i < n-1; i++)根本不会执行,est变量没初始化就直接返回,这属于未定义行为——可能打印随机垃圾值,甚至触发崩溃。 - 逻辑完全错了:它只比较相邻的两个元素,最后返回的是最后一对的最大值,而不是整个数组的最大值!
修复后的maxB函数应该是这样的:
float maxB(float v[], int n) { // 先处理非法输入,避免n=0的情况 if (n <= 0) { return 0.0f; } float est = v[0]; // 用第一个元素初始化最大值 for (int i = 1; i < n; i++) { printf("[%d]: %.2f\n", i, v[i]); if (v[i] > est) { est = v[i]; } } return est; }
3. 让main函数符合C标准
VS对C标准的兼容性要求很高,main()必须写成int main(),而且函数末尾要返回0,不然会触发未定义行为:
int main() { // 你的原有代码... printf("Biggest number %f\n", maxB(v, a)); return 0; // 必须加这个返回值 }
最终可正常运行的完整代码
把上面的修复整合起来,代码就可以在VS 2017里正常跑了:
#define _CRT_SECURE_NO_WARNINGS #define CON 10 #include <stdio.h> #include <stdlib.h> #include <time.h> float maxB(float v[], int n); float maxB(float v[], int n) { if (n <= 0) { return 0.0f; } float est = v[0]; for (int i = 1; i < n; i++) { printf("[%d]: %.2f\n", i, v[i]); if (v[i] > est) { est = v[i]; } } return est; } int main() { // 正确的srand初始化方式 srand((unsigned int)time(NULL)); float v[CON]; int a; printf("how many vector positions to test?\n"); scanf("%d", &a); while (a < 0 || a > CON ){ printf("invalid input!how many vector positions to test?\n"); scanf("%d", &a); } for (int i = 0; i < CON; i++){ v[i] = (float)(rand() % 10); } printf("Biggest number %f\n", maxB(v, a)); return 0; }
关于VS版本的问题
完全不需要更换版本!以上修复在VS 2017上完全适用,核心就是要遵循C标准写法,同时注意VS对类型安全和未定义行为的严格检查——这也是为什么在线编译器能跑但VS会崩溃的原因,在线编译器对这些问题的容忍度更高,但VS会帮你把潜在问题揪出来。
内容的提问来源于stack exchange,提问作者raijin
相关产品推荐
相关产品推荐

