#include
#include
#include
/*在32位的机器上*/
typedef struct
{
char cCr;
long lVal;
} TDATA_S;
int main()
{
TDATA_S stDat1, stDat2;
memset(&stDat1, 0, sizeof(TDATA_S));
stDat2.cCr = 0;
stDat2.lVal = 0;
if (memcmp(&stDat1, &stDat2, sizeof(TDATA_S)) == 0)
{
printf("same.\n");
}
else
{
printf("diff.\n");
}
return 0;
}
hml1006 于 2011-03-11 15:46:01发表:
编译器要进行内存对齐
linuxblack 于 2011-02-28 20:02:43发表:
受益匪浅!!谢谢。。
lunzhy 于 2011-02-23 09:18:34发表:
曾经看过这方面的知识!确实存在这样容易疏忽的知识点。推荐看下《高质量程序设计》。
另外像sizeof 与strlen也是不同的!
lang1437 于 2011-02-22 11:48:36发表:
自认为会点C的路过。。。回家面壁!
考乌特莫克 于 2011-02-18 23:05:29发表:
希望大家平时能够多发一些关于编程方面心得和自我理解的帖子,而并不仅仅是一些书籍或者一些为了刷等级的简单回复。这样才能够有一个更好的学习氛围和环境,对于不理解的问题,首先尽量自己思考,google一下看是否能解决,实在不会可以发出来大家研究一下。
考乌特莫克 于 2011-02-18 22:54:33发表:
8# pallana
就是在这种结构体变量进行初始化的时候,最好使用memset,因为这样做是有保障的。因为你不知道代码在未来维护的时候,有什么改动,万一增加了一个类似于memcmp的比较,可能就有bug了。这些细节的问题,平时编程的时候,我们还真的要注意!
奶茶dsk 于 2011-02-18 13:35:59发表:
{:3_114:} 这个和初始栈有关,
pallana 于 2011-02-18 09:33:23发表:
6# 考乌特莫克
这个意思就是说,如果我们要赋值,最好就是使用memset来操作,否则可能会造成一些错误,对吧。
naruto01 于 2011-02-17 22:29:51发表:
扩展LS
所以[code]char c1;
int i1;
char c2;[/code]与[code]char c1, c2;
int i1;[/code]可能存在一些差距
考乌特莫克 于 2011-02-17 22:22:44发表:
5# dchwlinux
typedef struct
{
char cCr;
long lVal;
} TDATA_S;
在32位系统中,这个结构体第一个字段是1个字节,第二个字段是4个字节,会有CPU寻址的优化,在第一个字节后面补齐三个字节。
对结构体进行sizeof运算得到的结果是8,关键就在于为了对齐的那3个字节,这个3个字节里面有垃圾数据,memcmp是按照比特位
进行比较的,所以stDat2虽然对两个字段都赋值0,但是有三个字节里面是垃圾数据,而stDat1是做了memset清零操作的,保证了
所有的字节里面都是0。你可以在比较的地方设置断点,然后看下内存里是不是又三个字节的垃圾数据,正是由于这个三个字节的垃圾
数据,导致比较不相等。
dchwlinux 于 2011-02-17 20:49:11发表:
4# 考乌特莫克
我猜是两个变量的类型不一样,char会转化成整型的ascii码,另一个是0的长整型,对不?
考乌特莫克 于 2011-02-17 19:39:43发表:
3# dchwlinux
正是diff。。。把代码放到vc里或者使用gdb调试跟踪一下,看看内存里的值。最好能够自己发现问题所在,那样对自己是一种提高。
dchwlinux 于 2011-02-16 16:48:06发表:
难道是diff?
Junyi 于 2011-02-16 08:43:15发表:
不懂C的路过