C语言结构体常见错误

之前在C语言结构体常见使用方法已经说过结构体其实是对一块空间的划分与使用,那么无论怎么折腾怎么改,都是这一亩三分地,只要找到相应地址,直接改也不奇怪(C的一大核心就是指针和地址)。


1.字符串覆盖其他成员:

简而言之,写入的字符串超出了长度,导致后边的成员被覆盖。

例如这种结构体和操作:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. typedef struct{  
  5. int iTest;  
  6. char pcArray[20];  
  7. int iParam;  
  8. }s;  
  9.   
  10. main(){  
  11.         s s1;  
  12.         s1.iParam = 5;  
  13.         s1.iTest = 6;  
  14.         printf("iTest:\t%p:%d\n",&s1.iTest,s1.iTest);  
  15.         printf("iParam:\t%p:%d\n",&s1.iParam,s1.iParam);  
  16.         strncpy(s1.pcArray,"Hello World,Hello World",23);  
  17.         printf("pcArray:\t%p:%s\n",&s1.pcArray,s1.pcArray);  
  18.         printf("iTest:\t%p:%d\n",&s1.iTest,s1.iTest);  
  19.         printf("iParam:\t%p:%d\n",&s1.iParam,s1.iParam);  
  20.   
  21.   
  22. }  
结果如下

[cpp]  view plain copy
  1. [root@j struct]# gcc array.c   
  2. [root@j struct]# ./a.out  
  3. iTest:  0xbfbebc64:6  
  4. iParam: 0xbfbebc7c:5  
  5. pcArray:    0xbfbebc68:Hello World,Hello World  
  6. iTest:  0xbfbebc64:6  
  7. iParam: 0xbfbebc7c:6581362  

因为字符串的超界操作,iParam已经被修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值