(Linux之初学篇)程序“正确”,printf却总是在我们“正确输出”后又多输出值

一般遇到这种情况的人,很可能是你的数组溢出了。我们写程序应该时刻警惕,printf是遇到\0结束。

假如我们定义一个数组,char buf[24],  buf="abcdefghiklmnopqrstuvwxyz"

printf("%s\n",buf);  那么这个程序是错误的,因为数组上传是它的首地址,printf不遇到\0不会终止,它在输出24

个字符后到栈里随机打印其他字符,直到遇到\0

下面我们举个例子:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
//#include<unistd.h>
int main()
{
        int fd;
        char op[24];
        system("rm -rf ha");
        system(" ifconfig eth1 >> ha");
        int n;
        fd=open("ha",O_RDONLY);
        n=read(fd,op,sizeof(op));
#if 1
        if(fd<0){
        printf("errno:%d,:%s\n",errno,strerror(errno));
        return 0;
        }
#endif
        printf("%d\n",n);
        printf("op的值为:%s\n",op); 
        close(fd); 
} 

Eth后面出现的是一个奇怪的符号,这就是数组溢出的悲剧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值