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程序设计入门--消息管理 ...
随机推荐
- Win10 远程桌面连接出现“要求的函数不受支持”的解决办法之修改注册表
问题起因 笔者自己在阿里云上搞服务器,有一台 Windows Server 必须通过远程桌面连接来管理,由于没能完全关掉 Win10 自带的烦人的系统更新,导致昨天安装完更新后出现了连接远程桌面时“要 ...
- dubbo协议报文格式
- EOS
1.移植性特别差,例如用Eclipse,idea,等其他集成工具开发之后的项目,难以快速的搭建到EOS集成工具中(例如逻辑流,数据结构等)2.项目框架的局限性大,底层封装的框架或者组件迭代性较差,很难 ...
- vue的搭建项目
请求的封装,先在src下面创建一个utils的文件夹,文件夹里面有ajax.js loading.js index.js to 1 请求的封装 ajax文件 需要引入的文件在后面 /* * [page ...
- python note 09 初识函数
1.函数 def my_len(): #自定义函数(相当于len) i = 0 for k in s: i += 1 print(i) print(my_len()) #输出None,因为没有返回值 ...
- Python-yield生成器
1.引入生成器的目的: 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件.它可以是mylist = [1, 2, 3],也可以是myli ...
- Eclipse中查看JDK类库源代码
在Eclipse中编写代码时,有时候可能需要了解JDK类库的一些特性,这个时候可以通过查看类的源代码来了解JDK类的详细信息.本文主要内容就是如何直接在Eclipse开发环境中查看JDK类库源代码. ...
- Oracle 数据库中对记录进行分页处理
学习到 oracle 的视图的时候,了解到对 Oracle 中数据的记录进行分页处理和 Mysql 提供的 limit 来进行分页处理大有不同,limit 是 mysql 中特有的关键字. 那么在 o ...
- python实现bt种子 torrent转magnet
Python实现bt转磁链 参考前人资料主要两种方式 1,利用python的bencode模块 2,安装libtorrent模块 尝试过两种方法特记录 环境:Windows系统 python 3 ...
- oracle 查询clob 列时 很慢 , 未解决
今天查询一张表 ,这张表有一个clob 列 select * from tableName : 很卡.. 难道是查询的太多? select * from tableName where rowN ...