标签:c语言易错点
1.结构体的计算
//struct BBB{
// long a;
// char c1;
// char c2;
// long b;
// long c;
//}*p;//sizeof(struct BBB)=16;
//int main()
//{
// p = (struct BBB*)0x100000;
// printf("0x%x", p + 0x1);//加整个结构体大小为0x10010
// printf(" 0x%x",(unsigned long) p + 0x1);//整型加1,0x100001
// printf(" 0x%x", (unsigned long*)p + 0x1);//加sizeof(unsigned long)*1,为0x100004
// printf(" 0x%x",(char *) p + 0x1);//加sizeof(char)*1,为0x100001
// system("pause");
// return 0;
//}2.结构体中结构体,共用体中结构体的大小
//union AAA{
// struct {
// char c1;
// short sl;
// char c2;
// }half;
// short kk;
//}number;
//struct BBB{
// char ucFirst;
// short us;
// char c2;
// short uo;
//}half;
//struct tagCCC
//{
// struct
// {
// char c1;
// short sl;
// char c2;
// }half;
// long kk;
//};//结构体是个整体按4对齐6+4=10,short和long中最大所占字节为4,4的整数倍为12
//int main()
//{
// printf("%d %d %d\n", sizeof(union AAA), sizeof(struct BBB), sizeof(struct tagCCC));
// system("pause");
// return 0;
//}执行结果:
1字节对齐:4 6 8
4字节对齐:6 8 12
3.如果case语句中没有break,那么它之后的语句都会被执行。
4.指针和const的声明:
(1)指针所指对象是可读的
const int *p;
int const *p;
(2)指针是可读的
int *const p;
(3)指针和指针所指对象都是可读的
const int * const p;
int const *constp;
5.动态开辟
void GetMemory(char *p,int len)
{
p=(char *)malloc(len);
}
int main()
{
char *p;
GetMemory(p,10);
strcpy(p,"bit");
printf("%s",p);
free(p);
}上述代码有三处错误!!!
a.此时调用函数p动态开辟和主函数p所指不是同一个地方,因为p只是临时拷贝,没传地址过去。
b.strcpy,出现错误,此时p无指向。
c.free时并未将其开辟(临时变量)的释放,且应在free后让指针指向空。
正确代码为:
void GetMemory(char **p,int len)
{
*p=(char *)malloc(len);
}
int main()
{
char *p;
GetMemory(&p,10);
strcpy(p,"bit");
printf("%s",p);
free(p);
p=NULL;
}本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1698559
标签:c语言易错点
原文地址:http://10541556.blog.51cto.com/10531556/1698559