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)呢?
18 19 36 4 4 4
#include<iostream>
using namespace std;
int func(int a[])
{
return sizeof(a);
}
int main()
{
char str[] = "welcome to 51_CC++";
int Array[] = {1,2,3,4,5,6,7,8,9};
char *p = str;
int n;
cout<<strlen(str)<<endl;
cout<<sizeof(str)<<endl;
cout<<sizeof(Array)<<endl;
cout<<sizeof(p)<<endl;
cout<<sizeof(n)<<endl;
func(Array);
cout<<sizeof(func(Array))<<endl;
}
2.观察下列程序运行时是否会出现问题,若有请指出,若不存在问题,请指出程序循环的次数。
#include<iostream>
using namespace std;
#define MAX_SIZE 255
void main()
{
unsigned char buff[MAX_SIZE +1];
unsigned char i;
int count = 0;
for(i=0; i<=MAX_SIZE; i++)
//for(i=0; i<=MAX_SIZE-1; i++)//修改
{
buff[i] = i;
cout<<"Hello"<<endl;
//++count;//修改后,循环255次
}
//cout<<count<<endl;
// return 0;
}
解析:死循环、数组越界访问
1) 数组buff的下标范围为0……MAX-1。 2)当循环i = 255时buff[255] = 255;但返回for(i=0; i<=MAX_SIZE; i++)时,
由于unsigned char 的取值范围在(0 ~ 255), 此后i++又从0 开始,无限循环下去。
3.添加#define AAA if(show_status == MMI_TRUE) #endif 的初衷是为了给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();
/*解析:添加上#define AAA if(show_status == MMI_TRUE) #endif的话,倘若AAA为真BBB为假,iF条件若成立才执
行gui_pop_clip();若不成立就不执行该句话,但在原题中此句话gui_pop_clip();是必须每次都要执行的。
隐患就是导致了gui_pop_clip();有可能执行,有可能不执行。
4.请问下列程序运行后会出现什么问题,该如何修改,另外从培养良好的编程规范角度看,哪些地方需要修改?
#include<stdio.h>
#include<malloc.h>
#include<string.h>
问题一
void GetMemory(char *p)//使用值传递方式,内存分配错误,strcpy失败,输出为空,因为p只是等于str但不是str,p=malloc(57);
{
p = (char*)malloc(57);
}
void main()
{
char *str = NULL;
GetMemory(str);
strcpy(str, "51_C++");
printf(str);
}
应改为:其一,也为问题二
void GetMemory(char **p)//内存分配函数,使用双重指针,传递进来的是str的指针地址,*pp为原来的str.
{
*p = (char*)malloc(57);//char **p=&str;str=*p=malloc(57).内存分配成功
free(*p);
}
void main()
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "51_C++");
printf(str);
printf("\n");
}
应改为二:使用引用的内存分配函数
void GetMemory(char *&p)//传递的为str的引用,函数内p还是str,分配成功
{
p = (char*)malloc(57);//char **p=&str;str=*p=malloc(57).内存分配成功
free(p);
}
void main()
{
char *str = NULL;
GetMemory(str);
strcpy(str, "51_C++");
printf(str);
printf("\n");
}
问题三
char* GetMemory(void)//会输出随机值,问题:不能返回一个临时值
{
char p[] = "51_C++";
return p;//(临时值)地址存在,内容不存在
}
void main()
{
char *str = NULL;
str = GetMemory();
printf(str);
printf("\n");
}
问题四
void main()
{
char *str = (char *)malloc(57);//此开辟的空间为两个第一是指针所指向的空间,第二就是指针
strcpy(str,"51CC");
free(str);//free掉了指针所指向的空间但是指针还存在是指针成为了野指针必须释放空间释放指针
if(str != NULL)//会输出c++说明str != NULL;
{
strcpy(str,"C++");
printf(str);
}
}
改正
void main()
{
char *str = (char *)malloc(57);//此开辟的空间为两个第一是指针所指向的空间,第二就是指针
strcpy(str,"51CC");
free(str);//free掉了指针所指向的空间但是指针还存在是指针成为了野指针必须释放空间释放指针
str = NULL; //将指针置空 free(str)与str = NULL应同时存在,在将空间释放的时候,将指针也置空。str = NULL预防野指针
if(str != NULL)
{
strcpy(str,"C++");
printf(str);
}
}
5、请实现以下功能的函数
实现对一个8bit数据(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 */
#include<iostream>
using namespace std;
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));
}
}
void main()
{
unsigned char data = 'A';
bit_set(&data, 5, true);//1000001(65 )变成了1010001(81)
cout<<(int)data<<endl;
}
6、实现一个字符串右循环移位函数,比如:"abcdefghi"循环右移2位就是"ihiabcdefg".
函数原型:void RightLoopMove(char *pStr,unsigned short steps)
函数参数说明:pStr:Point to a '\0' terminated string
steps:The rotate shift numbers
#include<iostream>
using namespace std;
/*1.效率高,但空间复杂度为O(n)*/
void RightLoopMove1(char *pStr,unsigned short steps)
{
int str_len = strlen(pStr);
int step = steps %str_len;
char *temp = (char*)malloc(sizeof(char)*step);
strncpy(temp, pStr+(str_len - step),step);
memcpy(pStr+step, pStr, str_len-step);
memcpy(pStr, temp, step);
free(temp);
temp = NULL;
}
/*2.空间复杂度为O(1),但效率低*/
void RightLoopMove2(char *pStr,unsigned short steps)
{
int str_len = strlen(pStr);
int step = steps %str_len;
char temp ;
while(step>0)
{
temp = pStr[str_len - 1];
for(int i=str_len -1; i>=0; --i)
pStr[i] = pStr[i-1];
pStr[0] = temp;
--step;
}
}
int main()
{
char str1[] = "abcdefghi";
char str2[] = "abcdefghi";
unsigned short steps = 22;
RightLoopMove1(str1, steps);
RightLoopMove2(str2, steps);
cout<<str1<<endl;
cout<<str2<<endl;
return 0;
}