C语言:指出程序中的问题总结(一)
1.下面程序把“hello”这个字符输出,请指出其中的错误:
void Test(){char pcArray[10];strncpy(pcArray, "hello", 5);printf("%s\n", pcArray);return;}
问题: 不会直接输出"hello"的,hello的后面还可能有随机值
原因:因为strncpy的第三个参数指定为5时,只拷贝5个字符即h、e、l、l、o,后面没有拷过去‘\0’,所以当pcArray这个数组的内容是随机值的时候,只覆盖前5个,后面的内容没有找到‘\0’,所以输出的是随机值。
修改:把5改为6
2.
#define BUFFER_SIZE 256void GetMemory(char **ppszBuf){if(NULL==ppszBuf){assert(0);return;}ppszBuf = (char *)malloc(BUFFER_SIZE);return;}void Test(){char *pszBuf = NULL;GetMemory(&pszBuf);strncpy(pszBuf, "hello world\r\n");printf("%s ", pszBuf);free(pszBuf);return;}
问题: ①程序执行过程中会发生崩溃 ②程序中有内存泄露
原因①:GetMemory函数在实现的时候并没有把动态开辟空间的地址存放到pszBuf中,所以strcpy拷贝时,pszBuf依然为 NULL,拷贝失败
原因②:GetMemory函数在返回之后,动态开辟的内存地址存放在ppszBuf指针变量中,但函数返回之后ppszBuf变量销毁,发生内存泄露
修改:在GetMemory函数内部,把动态开辟的内存的地址存放在*ppszBuf中
3.请指出下面这段程序中的错误:
unsigned long FUNC_B(unsigned long ulCount){unsigned long ulSum = 0;while (0 <= ulCount){ulSum += ulCount;ulCount;}return ulSum;}
问题: 会出现死循环
原因:因为unsigned long ulCount为无符号数,而无符号数是恒大于0的,即ulCount>=0恒成立,因此会出现死循环
4.下面程序期望输出str=hello world,指出其中错误
char* GetStr(char *p){p = "hello world";return p;}void main(){char *str = NULL;if (NULL != GetStr(str)){printf("\r\n str=%s", str);}return;}
问题:当GetStr函数返回之后并没有接收它的返回值,所以函数返回之后并没有得到hello world的首字符的地址,str依然为空指针,所以打印时不会打印出来我们想要的内容
修改:让str接收一下GetStr函数的返回值,即把if语句括号里面的改为:NULL !(str= GetStr(str))
5.下面代码中,函数Test执行完毕后,希望输出1,指出错误:
void VarInit(unsigned char *pucArg){*pucArg = 1;return;}void Test(){unsigned long ulGlobal;VarInit((unsigned char*)&ulGlobal);printf("%lu", ulGlobal);return;}
问题:把unsigned long指针强制转换为unsigned char*指针,而unsigned char*指针解引用后,只能访问四个字节中的一个字节,所以不会输出1
6.指出下面程序错误的地方:
LONG A(){if (条件1){return;}return VOS_OK;}VOID B(){if (A()){DoSomeThing1();}else{DoSomeThing2();}return;}
错误:LONG A在条件1的时候,返回的值写得不够明确,返回值不可预测
7.找出下面题目中的错误
#define ID_LEN 32struct STR_A{char aucID[ID_LEN];int iA;};struct STR_B{char *paucID;int iB;};void funcA(struct STR_A stA, struct STR_B *pstB){pstB->paucID = stA.aucID;}void main(){STR_A stA = { 0 };STR_B stB;strcpy(stA.aucID, "12345");func(stA, &stB);printf("%s\n", stB.paucID);}
错误:funcA函数在调用的时候,stA采用的是值传递,所以形参stA是实参stA的一份临时拷贝,而stB传参时传的是它的地址,pstB里面存的是stB的地址,函数内部pstB->paucID指向了形参stA里面的一块临时空间,当函数返回之后,形参stA销毁,外面的stB里面的paucID保存好了形参srA里面aucID的地址,这是一个危险的操作,会导致函数返回之后paucID成为野指针。
8.
#define MAX_LEN 2
void ConvertCode(_UC *p_byte, _UC num)
{_UL i = 0;for (i = 0; i < num; i++){p_byte[i] = ((p_byte[i] & 0xF0 >> 4) | ((p_byte[i] & 0x0F << 4);}
}void main(){_UC *str = NULL_PTR;ConvertCode(str, MAX_LEN);}
错误:对空指针的解引用操作,访问内存失败
9.指出下面函数的性能问题
#define MAX_PRAM_LENGTH 10000
typedef struct{unsigned char ucCommand;unsigned short usLength;unsigned char Para[MAX_PRAM_LENGTH];
}DEBUG_MSG;void PrintDebufMsg(DEBUG_MSG DebugMessage){int i;printf("\nCommand=%d", DebugMessage.ucCommand);for (i = 0; i < DebugMessage.usLength&&i < MAX_PRAM_LENGTH; i++){printf("\nPara[%d]=0x%x", i, DebugMessage.Para[i]);}}
问题:结构体过大,传参时采用值传递的形式,会使得函数在调用过程中,参数压栈的系统开销过大,从而降低程序的性能。
C语言:指出程序中的问题总结(一)相关推荐
- C语言 在程序中打开网页,模拟鼠标点击、键盘输入
C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述 记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...
- c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)
能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...
- C语言之程序中内存的来源:栈 堆 数据段
程序在运行的时候,其内存的来源主要通过三种方法: 栈 堆 数据段,总体上来讲栈是一般用来存放小内存的局部变量,堆内存和数据段的属性很像,在使用的的时候,如果这个变量是伴随程序一直存在则使用全局变 ...
- c语言规定 程序中各函数之间().,C语言基础笔试题
1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 ...
- [c语言]在程序中检测键盘按键
如何在程序中检测键盘 首先 我们直接上代码 #include <conio.h> #include <stdio.h> int main() { while (1) { swi ...
- c语言 音乐循环,在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
- C语言控制台程序中添加背景图片
(1) C语言写控制台程序是无法加图片的,只能用命令行输出,最多就是设置下背景和字体,颜色之类的.如果开发API窗口程序,完全依赖于操作系统的函数库.C语言本身并不提供这类函数. 下面是windows ...
- 金丹期前期:1.9、python语言-python程序中的异常与捕获
一.异常简介 1.一个异常的例子 当如下的Python程序在运行时检测到一个错误,一般这时候解释器就无法继续执行代码了,会出现一些错误的提示,这就是所谓的"异常". #! /usr ...
- 在c51语言的程序中 注释一般采用,【判断题】在 C51 语言的程序中,注释一般采用 /* */ 和 // 来实现。 (3.0分)...
当ab<0时,化简a2b的结果是()A.-abB.a-bC.-a-bD.ab (-5)2的化简结果为()A.25B.5C.-5D.-25 计算:-12764=______. 已知两圆的半径分别3 ...
最新文章
- linux 多进程 多线程的选择
- python十大高级特性_python--高级特性
- 皮一皮:所以说...哪里的程序猿最能吃辣?
- Falsy Bouncer(第二种解决方式)
- (原創) 如何使用Operator Overloading? (C/C++)
- 自然语言处理 —— 2.4 嵌入矩阵
- spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析
- sg nc的java下载,01_SG-NC-客户端安装说明及培训材料下载 3
- java课程 数独 文库_数独教案-完整版
- Mac 给新人的入手指南
- 快手首次透露商业化布局:将重点发力短视频广告
- 九章量子计算机 知乎,量子计算机《九章》问世 知乎微博消息: 北京时间 12 月 4 日凌晨 3 点,一篇重要文章以 First Releas... - 雪球...
- build-essential 软件包
- 【AI科幻】地球陨落·平行世界
- css设置全局内边距为0,重置CSS - 将填充和边距设置为0?
- js处理时间戳为各种格式/js判断公历/农历/周历节日和节气
- 在Win32下搭建opengl绘制环境
- FFMPEG AvFilter使用实例(实现视频缩放,裁剪,水印等)
- 是否该读博士(ZZ)
- flash助手推送关闭