分享一下今天遇到的两个问题,一个是关于C语言内存泄漏问题,另一个是关于Linux下grep使用时的问题
C语言内存泄漏问题:
给出如下代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *p;
p=(int*)malloc(4);
p[0]=12; //等于*p=12
p[1]=13; //等于*(p+1)=13
printf("%d\n",p[0]);
printf("%d\n",p[1]);
free(p);
return 0;
}
上述代码在VC++6.0下运行报错,错误截图如下:
原因是,我只申请了4字节的内存空间,但是却放了2个int(4字节)的数据,所以free的时候出现错误,但是!在GCC下编译却能运行,很奇怪(此问题待解决,如果懂的朋友可以在本文下方留言,欢迎讨论和学习)。(GCC是Win10下的CodeBlocks自带的MinGW的GCC5.1.0和RHEL7下的GCC4.8.2)
Linux的grep问题:
给出如下shell代码:
ll | grep a*
当前目录下有三个文件,分别为:a.c, a.c~, a.out。
而此shell运行的结果为:
为什么结果不是输出所有以a开头的文件呢,而输出了"Binary file a.out matches"?
我们先来复习一下管道符的作用,它将前一个命令的标准输出重定向到后一个命令的标准输入,所以,如果一个命令不支持接收标准输入,那么使用管道符就没意义了。
我们还需要知道grep的基本用法,即grep string_to_search file1 file2 file3...
再来看一下grep命令的手册,其中在DESCRIPTION有这样一段话(粉色框):
大概的意思是说,grep会在给出的文件中或者标准输入中寻找要匹配的字符串,也就是说文件或者标准输入二选一,那么如果文件和标准输入同时给出会怎么样呢,我们试验一下:在abc目录下有两个文件,名为myFile1和myFile2,其中myFile1内容是一行"hello",myFile2内容是一行"OKmy",然后是三个命令以及它们的运行结果(下图)
分析一下这三条命令:
1."grep my myFile1 myFile2":在给出的文件(myFile1和myFile2)中搜索字符串"my"
2."ls | grep my":在来自ls的标准输出中搜索字符串"my"
3."ls | grep my myFile1 myFile2":在这条grep中,我们同时给出了文件和标准输入(来自ls的标准输出),发现它运行的结果和第一条一样,所以我们可以看出,如果对grep同时给出文件和标准输入,那么它只在文件中搜索,而忽略标准输入!
现在,我们再来看一下最初的问题,直接在终端上写的*是一种通配符,它会自动进行文件名扩展(这里推荐《学习bash:第二版》,第一章将各种扩展讲得很详细),所以上述代码"ll |grep a*"经过扩展之后就是"ll |grep a.c a.c~ a.out"了,再来看看扩展后的代码是在干嘛,扩展后的代码将ll的输出通过管道符重定向到grep命令的输入,但是,由于grep已经给出了搜索的文件(a.c~和a.out),所以这个标准输入被忽略,所以这个扩展后的代码是在做:从a.c~和a.out文件中搜索字符串"a.c"!!!!而a.out是一个程序,是一个二进制文件,当grep在二进制文件搜索文本时会提示"Binary file a.out matches"!
解决方法,使用双引号或单引号来抑制文件名扩展(使*的通配符功能消失,变成普通的字符,而这个普通的*会被grep当作正则表达式的元字符——重复前一个字符0或多次!):
对上面粉色框中的文字更准确的理解:
grep会在给出的文件中搜索将要匹配的字符串,如果没有给出任何文件,那么将从标准输入中搜索,如下面的代码,只给出了要匹配的字符串"my"而没有给出文件,所以grep将在标准输入中搜索(按下^D结束标准输入流,也就结束了grep命令):
分享一下今天遇到的两个问题,一个是关于C语言内存泄漏问题,另一个是关于Linux下grep使用时的问题的更多相关文章
- 老李分享:Android性能优化之内存泄漏1
老李分享:Android性能优化之内存泄漏 前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
- 分享:linux下apache服务器的配置和管理
linux下apache服务器的配置和管理. 一.两个重要目录: Apache有两个重要的目录:1.配置目录/etc/httpd/conf:2.文档目录/var/www: 二.两种配置模式: Apac ...
- Linux下快速比较两个目录的不同
曾多次想要在Linux下比较目录a和目录b中文件列表的差别,然后对目录a比目录b中多出的文件.少掉的文件分别做处理.但是,在网上搜索了多次也都没找到能直接处理好的工具. 所以想了很多不少方法,自我感觉 ...
- 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d14047603a5bf1242ad01b 导语 内存泄漏问题大约是An ...
- Android内存泄漏分享
内容概述 内存泄漏和内存管理相关基础. Android中的内存使用. 内存分析工具和实践. 以下内容不考虑非引用类型的数据,或者将其等同为对应的引用类型看待--一切皆对象. 内存泄漏概念 不再使用的对 ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- linux 下部署nodejs(两种方式)
本次博客的编写时用的系统环境,刚装好的Centos 6.4 64位虚拟机. 另外关于linux 其他系统的安装 可以参考https://github.com/joyent/node/wiki/Ins ...
- Linux 下操作GPIO(两种方法,驱动和mmap)(转载)
目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...
随机推荐
- Eclipse中如何添加相对路径的外部jar包
在eclipse中进行java编程的时候,常常需要引用外部jar包.而采用相对路径引用jar包可以大大方便java工程的拷贝,这样使得java工程从一个路径转移到另一个路径时不用大费周章的修改外包ja ...
- 关于Git和GitHub的一些知识
git是分布式的版本控制工具,可离线,svn是集中式的,要联网操作.集中式的所有数据都放在服务器端,如果服务器宕机,则历史记录也可能就丢失了,这叫做单点故障.分布式的数据可直接保存在客户端. 为何要版 ...
- java之四种权限修饰符
java权限修饰符piublic.protected.private.置于类的成员定义前,用来限定对象对该类成员的访问权限. 修饰符 类内部 同一个包 子类 任何地方 private yes ...
- ReactNative: 使用尺寸类Dimensions获取屏幕尺寸
一.简介 在前面创建使用组件时,虽然使用的都是伸缩盒子布局,但是很少使用宽高来进行绝对定位.在iOS中可以通过UIScreen控件获取当前屏幕的宽高,同样地,在RN中提供了一个尺寸组件Dimensio ...
- win7安装centos7虚拟机
1. 场景描述 因测试中需要linux集群,目前的服务器不太方便部署,需要本机(windows7)启动多个linux虚拟机,记录下,希望能帮到需要的朋友. 2. 解决方案 2.1 软件准备 (1)使用 ...
- python 学习 (1-3)
流程控制if语句 语法种类: 第⼀种语法: if 条件: #引号是将条件与结果分开. 结果1. # 四个空格,或者⼀个tab键,这个是告诉程序满⾜这个条件的 结果2. 如果条件是真(True) ...
- python——map()函数
描述 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表. 语法 m ...
- Java分布式系统---消息中间件
简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信.当下主流 ...
- 剑指offer笔记面试题12----矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径 ...
- JQuery Deferred对象使用小结
场景描述 如下,打开页面时,获取默认选中的项目,同时也会初始化Combobox下拉框下拉列表数据 问题描述 获取默认选中项目及下拉列表的js函数位于common.js文件,类似如下: // 根据项目类 ...