之前在C语言结构体常见使用方法已经说过结构体其实是对一块空间的划分与使用,那么无论怎么折腾怎么改,都是这一亩三分地,只要找到相应地址,直接改也不奇怪(C的一大核心就是指针和地址)。
1.字符串覆盖其他成员:
简而言之,写入的字符串超出了长度,导致后边的成员被覆盖。
例如这种结构体和操作:
- #include <stdio.h>
- #include <string.h>
- typedef struct{
- int iTest;
- char pcArray[20];
- int iParam;
- }s;
- main(){
- s s1;
- s1.iParam = 5;
- s1.iTest = 6;
- printf("iTest:\t%p:%d\n",&s1.iTest,s1.iTest);
- printf("iParam:\t%p:%d\n",&s1.iParam,s1.iParam);
- strncpy(s1.pcArray,"Hello World,Hello World",23);
- printf("pcArray:\t%p:%s\n",&s1.pcArray,s1.pcArray);
- printf("iTest:\t%p:%d\n",&s1.iTest,s1.iTest);
- printf("iParam:\t%p:%d\n",&s1.iParam,s1.iParam);
- }
- [root@j struct]# gcc array.c
- [root@j struct]# ./a.out
- iTest: 0xbfbebc64:6
- iParam: 0xbfbebc7c:5
- pcArray: 0xbfbebc68:Hello World,Hello World
- iTest: 0xbfbebc64:6
- iParam: 0xbfbebc7c:6581362
因为字符串的超界操作,iParam已经被修改