计算机系统基础日志No.3

计算机系统基础日志No.3

内存泄露,核心转储

一,源程序

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int a[2];
    double d;
} struct_t;

double fun(int i) {
    volatile struct_t s;
    s.d = 3.14;
    s.a[i] = 1073741824; /* Possibly out of bounds */
    return s.d; /* Should be 3.14 */
}

int main(int argc, char *argv[]) {    
    int i = 0;
    if (argc >= 2)
	i = atoi(argv[1]);
    double d = fun(i);
    printf("fun(%d) --> %.10f\n", i, d);
    return 0;
}

二,编译运行

在这里插入图片描述
lwh@lwh-virtual-machine:~$ gcc fun.c
lwh@lwh-virtual-machine:~$ gcc fun.c -o fun
lwh@lwh-virtual-machine:~$ ./fun 0
fun(0)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 1
fun(1)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 2
fun(2)–>3.1399998665
lwh@lwh-virtual-machine:~$ ./fun 3
fun(3)–>2.0000006104
lwh@lwh-virtual-machine:~$ ./fun 4
fun(4)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 5
fun(5)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 6
*** stack smashing detected ***: terminated
已放弃 (核心已转储)

三,函数,类型修饰符及出现的问题分析

1.argc、argv的具体含义

(在上篇日志中也有介绍)
argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char env ) 中
第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]指向程序运行的全路径名
argv[1]指向在DOS命令行中执行程序名后的第一个字符串
argv[2]指向执行程序名后的第二个字符串
argv[3]指向执行程序名后的第三个字符串
argv[argc]为NULL
第三个参数,char
型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

2.atoi函数 (表示 ascii to integer)

是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符(’\0’)才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。特别注意,该函数要求被转换的字符串是按十进制数理解的。

3.volatile

是一个类型修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
一般商业编程中会用到

4*.溢出原因猜测

s.a[i] = 1073741824可能是溢出的原因
1073741824(10)=0100 0000 0000 0000 0000 0000 0000 0000

<1>进行三组测试
(1)s.a[i] = 1073741824

(原程序已测试)
fun(3)–>2.0000006104==

(2)s.a[i]=107374 1824

lwh@lwh-virtual-machine:~$ gcc fun.c -o fun
lwh@lwh-virtual-machine:~$ ./fun 0
fun(0)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 1
fun(1)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 2
fun(2)–>3.1399993897
lwh@lwh-virtual-machine:~$ ./fun 3
fun(3)–>0.0000000000
lwh@lwh-virtual-machine:~$ ./fun 4
fun(4)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 5
fun(5)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 6
*** stack smashing detected ***: terminated
已放弃 (核心已转储)

(3)s.a[i] = 1173741824

lwh@lwh-virtual-machine:~$ ./fun 0
fun(0)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 1
fun(1)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 2
fun(2)–>3.1399999109
lwh@lwh-virtual-machine:~$ ./fun 3
fun(3)–>108339120429101005338864254976.0000000000
lwh@lwh-virtual-machine:~$ ./fun 4
fun(4)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 5
fun(5)–>3.1400000000
lwh@lwh-virtual-machine:~$ ./fun 6
*** stack smashing detected ***: terminated
已放弃 (核心已转储)

<2>分析

通过比对三组数据发现,s.a[i] = 1073741824的确对数据有影响,尤其体现在fun(3)上,另,根据不同电脑运行结果(32位机和64位机)发现,有的电脑在fun(4)处即出现了问题,可以预见是由于电脑位数不同出现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值