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语言:指出程序中的问题总结(一)相关推荐

  1. C语言 在程序中打开网页,模拟鼠标点击、键盘输入

    C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述         记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...

  2. c语言中延时时间计算,能精确计算C语言延时程序中延时时间的小工具(转)

    能精确计算C语言延时程序中延时时间的小工具 Emu51Form是一个软仿真计时器 具体使用方法为: 1.打开 keil\tools,ini 文件,在它的c51栏中加入 AGSI9=Emu51Form. ...

  3. C语言之程序中内存的来源:栈 堆 数据段

    程序在运行的时候,其内存的来源主要通过三种方法:  栈  堆  数据段,总体上来讲栈是一般用来存放小内存的局部变量,堆内存和数据段的属性很像,在使用的的时候,如果这个变量是伴随程序一直存在则使用全局变 ...

  4. c语言规定 程序中各函数之间().,C语言基础笔试题

    1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 ...

  5. [c语言]在程序中检测键盘按键

    如何在程序中检测键盘 首先 我们直接上代码 #include <conio.h> #include <stdio.h> int main() { while (1) { swi ...

  6. c语言 音乐循环,在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  7. C语言控制台程序中添加背景图片

    (1) C语言写控制台程序是无法加图片的,只能用命令行输出,最多就是设置下背景和字体,颜色之类的.如果开发API窗口程序,完全依赖于操作系统的函数库.C语言本身并不提供这类函数. 下面是windows ...

  8. 金丹期前期:1.9、python语言-python程序中的异常与捕获

    一.异常简介 1.一个异常的例子 当如下的Python程序在运行时检测到一个错误,一般这时候解释器就无法继续执行代码了,会出现一些错误的提示,这就是所谓的"异常". #! /usr ...

  9. 在c51语言的程序中 注释一般采用,【判断题】在 C51 语言的程序中,注释一般采用 /* */ 和 // 来实现。 (3.0分)...

    当ab<0时,化简a2b的结果是()A.-abB.a-bC.-a-bD.ab (-5)2的化简结果为()A.25B.5C.-5D.-25 计算:-12764=______. 已知两圆的半径分别3 ...

最新文章

  1. linux 多进程 多线程的选择
  2. python十大高级特性_python--高级特性
  3. 皮一皮:所以说...哪里的程序猿最能吃辣?
  4. Falsy Bouncer(第二种解决方式)
  5. (原創) 如何使用Operator Overloading? (C/C++)
  6. 自然语言处理 —— 2.4 嵌入矩阵
  7. spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析
  8. sg nc的java下载,01_SG-NC-客户端安装说明及培训材料下载 3
  9. java课程 数独 文库_数独教案-完整版
  10. Mac 给新人的入手指南
  11. 快手首次透露商业化布局:将重点发力短视频广告
  12. 九章量子计算机 知乎,量子计算机《九章》问世 知乎微博消息: 北京时间 12 月 4 日凌晨 3 点,一篇重要文章以 First Releas... - 雪球...
  13. build-essential 软件包
  14. 【AI科幻】地球陨落·平行世界
  15. css设置全局内边距为0,重置CSS - 将填充和边距设置为0?
  16. js处理时间戳为各种格式/js判断公历/农历/周历节日和节气
  17. 在Win32下搭建opengl绘制环境
  18. FFMPEG AvFilter使用实例(实现视频缩放,裁剪,水印等)
  19. 是否该读博士(ZZ)
  20. flash助手推送关闭

热门文章

  1. Java NIO框架(Java编程)
  2. 三维货架空间布局的优化算法——详细版
  3. acm 改革春风吹满地
  4. 博彦科技面试2-10
  5. 江阴市高中计算机会考知识点,明天高考考点能看啦!时间安排在...
  6. 2.3.3 x86 虚拟机创建的问题
  7. Buyou:让你在iPad上轻松购物
  8. Vivado IP核被锁的解除方法
  9. 微信支付--安装支付证书的坑
  10. Flexsim第一周--代码部分学习