CSAPP 练习题 2.25 -- 关于无符号数 -1 的不曾预料到的意外结果

直接上代码块

#include <stdio.h>

float sum_elements(float a[], unsigned length);
int main(int argc, const char *argv[])
{
	float a[] = {1.0,2.0,3.3,4.3,5.6,6.1,7.8,8.5,9.0,10.1};
	sum_elements(a, 0);
	return 0;
}
float sum_elements(float a[], unsigned length){

	int i;
	float result = 0;
	for(i=0; i<= length-1; i++)
		result +=a[i];
	return result;
}

这里 i< length -1 , 因为length是无符号数,所以 当length = 0 , 0-1 = -1 , -1 的无符号数表示 是0xFFFFFFFFF,所以,i会一直增值往 这个最大的无符号数奔去……

测试结果:内存访问越界

linux@linux:~/clanguage/csapp$ gcc e225.c -o e225 -Wall
linux@linux:~/clanguage/csapp$ ./e225
Segmentation fault (core dumped)

gdb 调试过程

(gdb) b 7
Breakpoint 1 at 0x8048450: file e225.c, line 7.
(gdb) r
Starting program: /home/linux/clanguage/csapp/e225 

Breakpoint 1, main (argc=1, argv=0xbffff734) at e225.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值