解决数组过大导致Stack Overflow的两个方法:改变栈大小和使用堆来存放数组

一、检查以下代码的问题,并进行修改

int  a[20][650][1000],i,j,k;
	for (i = 0; i < 20; i++)
		for (j = 0; j < 650; j++)
			for (k = 0; k < 1000; k++)
				a[i][j][k] = 0;

出错信息:0xC00000FD: Stack overflow (参数: 0x00000000, 0x00E42000)。
即栈溢出,通常来说,栈的大小为1024K bytes=1024x1024 bytes。上面那个数组的大小=20x650x1000x4 bytes。可见,数组的大小已经超过了栈的大小。所以会出现栈溢出这种现象。
二、解决办法
1、改变栈的大小
在visual studio中修改栈的大小:
项目->属性->链接器->系统。如下图所示:
在这里插入图片描述
在下方的方框中我们可以看到默认值是1MB,我们将之修改为6000000,注意,单位是bytes
再次实验:
(1)当数组大小小于设置栈大小,数组占用bytes=25121000*4=4096000<6000000。

	int  a[2][512][1000],i,j,k;
	for (i = 0; i < 2; i++)
		for (j = 0; j < 512; j++)
			for (k = 0; k < 1000; k++)
				a[i][j][k] = 0;

再次编译,没有错误。
(2)当数组大小大于设置栈大小,数组占用bytes=35121000*4=6144000>6000000。

int  a[3][512][1000],i,j,k;
	for (i = 0; i < 3; i++)
		for (j = 0; j < 512; j++)
			for (k = 0; k < 1000; k++)
				a[i][j][k] = 0;

再次编译,出错:Stack overflow

2、不使用栈,而使用堆
修改方法:

    int ***p, i, j, k;
	p =(int ***) malloc(sizeof(int)*20);
	for (i = 0; i < 20; i++)
	{
		p[i] = (int **)malloc(sizeof(int) * 650);
		for (j = 0; j < 650; j++)
		{
			p[i][j] = (int*)malloc(sizeof(int) * 1000);
			for (k = 0; k < 1000; k++)
			{
				p[i][j][k] = 0;
			}
		}
	}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是使用C语言数组方法两种方法分别实现的各种进制相互转换系统的代码: ## 使用C语言数组方法 ```c #include <stdio.h> #include <string.h> #include <math.h> void convert(int num, int base, char *result) { int i = 0; while (num != 0) { int rem = num % base; if (rem < 10) { result[i++] = rem + '0'; } else { result[i++] = rem - 10 + 'A'; } num /= base; } result[i] = '\0'; strrev(result); } int to_decimal(char *num, int base) { int len = strlen(num); int power = 1; int result = 0; for (int i = len - 1; i >= 0; i--) { int digit; if (num[i] >= '0' && num[i] <= '9') { digit = num[i] - '0'; } else { digit = num[i] - 'A' + 10; } result += digit * power; power *= base; } return result; } void convert_base(char *num, int from_base, int to_base, char *result) { int decimal = to_decimal(num, from_base); convert(decimal, to_base, result); } int main() { char num[32], result[32]; int from_base, to_base; printf("请输入一个数字:"); scanf("%s", num); printf("请输入该数字的进制:"); scanf("%d", &from_base); printf("请输入要转换成的进制:"); scanf("%d", &to_base); convert_base(num, from_base, to_base, result); printf("转换后的数字为:%s\n", result); return 0; } ``` ## 使用方法 ```c #include <stdio.h> #include <string.h> #include <math.h> struct Stack { int top; char items[32]; }; void push(struct Stack *s, char c) { s->items[++s->top] = c; } char pop(struct Stack *s) { if (s->top == -1) { return '\0'; } return s->items[s->top--]; } void convert(int num, int base, char *result) { struct Stack s; s.top = -1; while (num != 0) { int rem = num % base; if (rem < 10) { push(&s, rem + '0'); } else { push(&s, rem - 10 + 'A'); } num /= base; } int i = 0; while (s.top != -1) { result[i++] = pop(&s); } result[i] = '\0'; } int to_decimal(char *num, int base) { int len = strlen(num); int power = 1; int result = 0; for (int i = len - 1; i >= 0; i--) { int digit; if (num[i] >= '0' && num[i] <= '9') { digit = num[i] - '0'; } else { digit = num[i] - 'A' + 10; } result += digit * power; power *= base; } return result; } void convert_base(char *num, int from_base, int to_base, char *result) { int decimal = to_decimal(num, from_base); convert(decimal, to_base, result); } int main() { char num[32], result[32]; int from_base, to_base; printf("请输入一个数字:"); scanf("%s", num); printf("请输入该数字的进制:"); scanf("%d", &from_base); printf("请输入要转换成的进制:"); scanf("%d", &to_base); convert_base(num, from_base, to_base, result); printf("转换后的数字为:%s\n", result); return 0; } ``` 这两个程序的实现方法略有不同,但都可以实现各种进制之间的相互转换。可以根据需要选择使用哪一种方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树下等苹果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值