C语言编程遇到的问题
1.内存泄漏问题
问题代码1
#include <stdio.h>
#include <stdlib.h> int main( int argc, char *argv[] )
{
unsigned int i = ;
char *str = "hello world!\r\n";
char *t = calloc( , sizeof( char ) ); while( str[i] )
{
*t++ = str[i];
i++;
}
t[i] = ;
printf( "%s", t );
printf( "%s", str );
free( t ); return ;
}
上述代码要做的事情十分简单:将str字符指针指向的字符串复制到字符指针t指向的内存区域,t指向了一块200bytes大小的内存空间,为了保持str始终指向“hello world!\r\n”,没有对str变量本身进行增减操作。该程序运行的结果如下:
hello world!
Segmentation fault (core dumped)
其实问题出在free()这里,即内存泄漏问题,传入该函数的指针变量必须指向之前分配好的地址,否则会产生内存释放失败。上述程序首先通过calloc()获得了一个内存地址,并放在字符指针变量t中,但是复制的时候t发生了变化,因此传入free()的参数并非calloc()的返回值,因此报错。
一种解决方法是,使用一个指针变量记录分配得到的内存地址,但是并不操作它,只有在最后释放的时候作为free()的参数。
问题代码2
#include <stdio.h>
#include <stdlib.h> int main( int argc, char *argv[] )
{
unsigned int i = ;
char *s = calloc( , sizeof( char ) );
char *t = s;
char *str = "abcdefghijklmn"; while( str[i] )
{
s[i] = str[i];
i++;
}
printf( "%s\n", t );
free( t ); return ;
}
上述代码的功能也是实现字符串的复制,将str指向的“abcdefghijklmn”复制到s指向的内存中。运行后的错误如下:
abcdefghijklmn
*** glibc detected *** ./y: free(): invalid next size (fast): 0x084b0008 ***
======= Backtrace: =========
xxxxxxxxxxxxxxxxxxxxxx此处省略一些信息
======= Memory map: ========
xxxxxxxxxxxxxxxxxxxxxx此处省略一些信息
Aborted (core dumped)
错误的原因是,calloc()只申请了5个字节大小的内存空间,而该程序将十几个字符都写入了该片内存,释放的时候检查到内存访问越界,因此报错,这里只要申请足够大的内存空间就可以了。
2. fflush()清空stdin数据流失败。
问题代码:
#include <stdio.h> int main( int argc, char *argv[] )
{
char i, j, c; scanf( "%c", &i );
fflush( stdin );
scanf( "%c", &j ); printf( "%x %x\n", i, j ); return ;
}
现象:程序期待两个字符,第二次执行scanf函数之前已经使用fflush清空输入缓冲区,但是输入一个字符之后,便输出结果,显示输入的字符以及一个十六进制数a。
原因:fflush()函数没有起作用,第二个scanf获取到了换行符。
解决方案:有必要的时候,清空输入缓冲区。清空的方案有两种:使用fflush()函数或者使用getchar()。
fflush()用于清空缓冲区,多半指的是输出缓冲区,有些版本的函数库并不支持清空输入缓冲区,所以可移植性不强,这里使用的glibc就不支持,因此出错。
移植性较强的代码实现是:while( ( c = getchar() ) != '\n' && c != EOF )
C语言编程遇到的问题的更多相关文章
- C语言编程实现Linux命令——who
C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...
- 个人c语言编程风格总结
总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++
前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- 9 本免费的 Python 语言编程书籍(转载)
9 本免费的 Python 语言编程书籍 原文地址:http://linuxtoy.org/archives/9-free-python-books.html 2010-03-03 Toy Poste ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
随机推荐
- fiddler抓取https请求
Fiddler抓取https设置详解(图文):https://www.cnblogs.com/joshua317/p/8670923.html Fiddler要抓取到https请求我们还需要Fiddl ...
- Java框架spring 学习笔记(十二):aop实例操作
使用aop需要在网上下载两个jar包: aopalliance.jar aspectjweaver.jar 为idea添加jar包,快捷键ctrl+shift+alt+s,打开添加jar包的对话框,将 ...
- winform UI 设计方法
这里主要提供了一种设计思路,你可以将成套的UI图像添加或替换到本程序中.在设计过程中,还存在许多疏漏,懒得仔细修改了,在使用过程中自行修改添加.这里的函数基本上都可以单独使用,需要哪个将cs文件加入到 ...
- poj 1141 Brackets Sequence 区间dp,分块记录
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35049 Accepted: 101 ...
- ARM汇编指令格式
一.ARM介绍 1) arm汇编中,程序下一步执行哪一条指令,是根据程序计数器(PC)的值来决定. 类比于8086的CS:IP的功能. 2) 8086属于CISC(复杂指令集),每条指令长度不等,ar ...
- idea中springboot项目设置热部署
技术交流群:816227112 File-Settings-Compiler-Build Project automatically ctrl + shift + alt + /然后选择Registr ...
- oracle异机恢复 open resetlogs 报:ORA-00392
参考文档:ALTER DATABASE OPEN RESETLOGS fails with ORA-00392 (Doc ID 1352133.1) 打开一个克隆数据库报以下错误: SQL> a ...
- NC 6.X笔记(编辑中)
1.参照多选 写在编辑前事件中 ((UIRefPane) editor.getBillCardPanel().getBodyItem("pk_wa_item").getCompon ...
- Java获取请求主机真实ip
一般情况下 getRemoteAddr()是可以正常使用的,代码如下: public String getIpAdress(HttpServletRequest request) { ip = req ...
- 2-1 如何抓不同的接口(手机抓包,web网页抓包)
举个例子,一个测试和安卓的对话. 测试:Android你这里有个bug Android:这是服务端的bug 测试:是你这里显示的不对 Android:你去看服务端返回数据,他不对,你会不会测试. 从这 ...