c语言 易错,c语言中,易错知识点

本文探讨了C语言中结构体的内存对齐规则,包括结构体内部成员的排列方式以及指针加法的细节。同时,介绍了结构体嵌套结构体和共用体的情况下的大小计算。此外,还提到了`case`语句中`break`的使用,以及`const`关键字在指针声明中的应用。最后,通过一个动态分配内存的错误示例,讲解了动态内存管理的正确做法。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值