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));
}
}