c语言的改错练习

来源:互联网 发布:vgg19网络结构图 编辑:程序博客网 时间:2024/05/18 00:26

1.Windows NT 下的32位机运行环境下:

char str[] = "Welcome to 51_CC++";

int Array[] = {1,2,3,4,5,6,7,8,9};

char *p = str;

int n;

int func(int a[]);

请计算:strlen(str), sizeof(str), sizeof(Array), sizeof(p), sizeof(n),如果函数func参数传递数组Array,那么sizeof(a)呢?

strlen 和sizeof 的区别在于用sizeof计算字符串长度时要加一,因为还有一个字符串结束标志‘\0’,而strlen没有

因此 strlen(str) = 18  ,sizeof(str)  = 19

sizeof(Array) = 36.//一共是九个int类型的数据,4×9 = 36

sizeof(p) = 4  // p是指针,指针占四个字节的大小

sizeof(n) = 4 //n 被定义为int类型,int占四个字节

sizeof(a) = 4//传递数组实际上传递的是数组首元素的地址,也可看为一个指针,指针占四个字节

2.请观察下列程序运行时是否会出现问题,若有,请指出问题,若不存在问题,请指出程序循环的次数。

#define MAX_SIZE 255

void main()

{

      unsigned char buff[MAX_SIZE+1];

     unsigned char i;

     for(i = 0;i <= MAX_SIZE; i++)

    {

         buff[i] = i;

   }

}

i被定义为无符号字符型,取值范围是0~255,最大值是255,永远也不可能比255要大,所以程序会无限次的循环

3.添加下面粗斜体部分代码的初衷是为了给gui_show_image 这句代码的执行加上限制条件,请问这样修改有没有什么隐患,若有,该如何修改?

.........................................

    gui_push_clip();

#ifdef   AAA

          if (show_status  ==  MMI_TRUE)

#endif

#ifdef   BBB

        gui_show_image(x  ,  y ,   image_id);

#endif

 

gui_pop_clip();

update_dt_display();

..........................................

这段程序如果定义了AAA,也定义了BBB完全能够满足提议,给函数加上了限制条件,但若只定义了AAA,没有定义BBB程序也会执行,与一开始的想法就不相符了

4.请问下面程序运行后会出现什么问题,,该如何修改,另外,从培养良好的编程规范角度看,哪些地方需要修改?

1>>.

void GetMemory(char *p)

{

     p = (char*)malloc(57);

}

Void main()

{

      char *str  = NULL;

      GetMemory(str);

     strcpy(str,"   51  C++");

    printf(str);

}

传参数是值传递,p 不会改变str的空间内容,拷贝时会崩溃,可以将传递参数改为*&p

或者GetMemory(&str),传**p

2>>

char *GetMemory(void)

{

     char p[] = "51 C++";

    return p;

}

Void main()

{

     char *str = NULL;

     str = GetMemory();

     printf(str);

}

不应返回临时空间对象,他在函数结束后会自动释放空间,返回时就会变得不确定,有可能是乱码

3>>

Void GetMemory(char** p  )

{

    *p = (char* )malloc(57);

}

Void main()

{

     char *str = NULL;

    GetMemory(&str);

    strcpy(str,"  51  C++");

    printf(str);

}

会造成内存泄漏

4>>

Void main()

{

     char *str = (char * )malloc(57);

     strcpy(str,"51CC");

     free(str);

     if(str != NULL)

    {

          strcpy(str."C++");

          pPrintf(str);

     }

}

在进行free操作后,会释放掉str所占用的空间,因此str就会变成一个没有指向的野指针,所以最终得到的输出结果就是不确定的

5.请编码实现以下功能的函数

功能:实现对一个8 bit数据(unsigned char 类型)的指定位(例如第n位)的置0或者置1操作,并保持其他位不变。

函数原型:

void bit_set(unsigned char *p_data,unsigned char position,bool flag)

函数参数说明:

P_data 是指定的源操作,position是指定位(取值范围 1~8);flag 表示是置0还是置1操作,true:置1   false :置0

具体实现如下:

void bit_set(unsigned char *p_data,unsigned char position,bool flag)

{

      if(flag)

      {

           *p_data |= 1<<(position - 1);

      }

     else

    {

         *p_data &= ~(1<<(position -1));

     }

}