首页 > 学院 > 开发设计 > 正文

科锐课堂笔记:2017/3/6 一维数组与多维数组

2019-11-06 06:09:15
字体:
来源:转载
供稿:网友
栈溢出错误码是0xC00000FD,造成栈溢的原因是递归次数过多,函数的参数及保存现场信息是存放在栈里的,这部分内容将栈占满了。大部分0xC00000FD的异常是由于递归函数的设计问题引起的,没有设置返回条件判断(或漏了一些)从而造成递归死循环。VC6默认的栈大小是1M,有时候确实因为计算量大递归次数过多,默认栈不够用的话,可以用linker参数“/stack:0xXXXX,0xXXXX”指定栈大小,前一个是保留的栈大小,后一个是提交的栈大小。(在32位平台上最终都会以4字节对齐)

  减少给调用者(理解成导出吧)函数参数的方法,可将函数定义为一个代理函数,代理函数将调用真正的内层函数完成功能,这样做的好处在设计上使用了分层,参数的检查、转换、传递可由外部代理函数实现,内部函数只需完成功能代码。

  编译后生成与CPU相关的二进制目标文件,目标文件与平台是无关的。链接的过程将各目标文件合并生成针对某平台的可执行文件。

  数组是同类型数据的集合,在一次编译的语言中(如C/C++),数组的长度定义必须是常量或常量表达式(能在编译前计算出),且数组的赋值只能在定义时,赋值数组的内容可以是常量、变量或函数等。(因为赋值动作是运行时完成的)  线性是逻辑概念,连续是物理描述。  数组换算公式:首地址(指针)+下标(整型)*sizeof(数组类型)。  举例有int a[5] = {1,2,3,4,5}:  那么a[2]等同于2[a],在C语言中[]运行符,接受一个指针与一个整型,前后顺序无关,所以a[2]和2[a]都会转换成上面的公式,算出的地址值是一样的,取值结果都是3。

  类似的二维数组被转换成:首地址(指针)+下标1(整型)*sizeof(数组类型[定义的第二维的元素个数])+下标2(整型)*sizeof(数组类型)。如有一个int a[3][5];可知a[1][2]=1[a][2],但不等于1[2][a],编译器是一级一级运算的,先算1[2],发现两个都是整型便会报错了。  其实二维、多维本质上都可以看成一维数组,多维数组只是在逻辑上的概念让人们更容易理解与记忆,在内存中都是以一维数组的形式存储的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表