谨防动态数组越界造成的内存泄露

本文介绍了Delphi中的静态数组与动态数组的区别,特别是关于数组下标越界的处理方式。静态数组在编译时会检查越界错误,而动态数组则不会进行此类检查,需要开发者自行注意。文章还提供了一个示例程序来说明这一点。

在Delphi中,静态数组,编译器会自动检测下标是否越界,动态数组,不会自动检测。

注意:delphi中数组的下标索引是从0开始的,也就是说,如果数组长度为2,则下标索引分别为0,1

procedure TestArray;

var

arr1: array[0..2] of byte; //静态数组

arr2: array of byte;//动态数组

begin

//静态数组

arr1[0] := 1;

arr1[1] := 2;

arr1[2] := 3;

arr1[3] := 4; //这一行不能编译通过,会提示下标越界

//动态数组

SetLength(arr2, 3);

arr2[0] := 1;

arr2[1] := 2;

arr2[2] := 3;

arr2[3] := 4; //这一行能编译通过,但是已经造成了内存泄露,要谨防这样使用

end;

在课上我们学过了生命游戏的写法。现在我们实践一下,写一个降维版本的生命游戏(一维),规则如下: 每个细胞有左右各 3 个,共 6 个相邻位置(如果在边缘处,则不考虑实际不存在的位置) 有两个物种 A B 相互竞争 若此轮某位置为空,相邻位置上有 个生命为同类,没有异类,则下轮在此处生成一个同类生命 若此轮某位置存在生命 相邻位置上存在竞争物种,则在下轮消亡 相邻位置上存在 个同类物种,则因为拥挤而在下轮消亡 相邻位置上存在 个同类物种,则因为孤独而在下轮消亡 (题目注解 👇 里有一些你可能会用到的工具) 请勿在代码包括注释中出现 [ 和 ] 及其替代,否则你会获得 0 分答案错误! 输入格式 第一行一个整数 ,表示模拟轮数; 第二行一个长度 ,仅包含 'A', 'B', '.'(小数点)的字符串,表示两个物种和空位。 输出格式 一行一个字符串,表示 轮模拟后的情况。 测试样例 Input 3 ..A.A Output .AAA. Input 10 ..A.A...B.B.. Output AA.........BB Input 1 ...A.AA...AAAA.AA..A.B..B.A.A..A...A. Output ..AAAAAAAAAAA..AAA..........AAA.AAA.. 题目注解 要记得数组(字符串)初始化,防止 UB (未定义行为) 的产生。 提示: 注意边界情况,谨防数组越界与未初始化。 本题可以仅在输入输出时用字符串,其余均使用数组。 输入时 < strong > 强烈推荐使用 scanf ("% s", 字符串变量); 容错性最高。 可以使用 <string.h> 中的 strlen (字符串变量) 来得到字符串的长度,将其赋值给某变量。 多次初始化字符串,可以使用 <string.h> 中的 memset (字符串变量,'.', sizeof (字符串变量)); 来初始化一个字符串,使其全部变为 '.';也可以写成 memset (字符串变量,'.', 字符串长度 * sizeof (char)); (初始化 int 型的数组也可以类推为 memset (数组变量,0, sizeof (数组变量)); 或 memset (数组变量,0, 数组长度 * sizeof (int));,但别用这个函数给 int 型数组赋非 0 值) 本题的一些做法可能需要用到字符串赋值,即让一个字符串等于另一个字符串,可以使用 <string.h> 中的 strncpy (strA, strB, n); 来将 s t r B strB 字符串的前 n n 位逐一赋值给 s t r A strA 字符串,所谓 strncpy 即对字符串(string)限定长度(n)的复制(copy)。
最新发布
12-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值