红联Linux门户
Linux帮助

发个简单的题目考考大家对C语言细节上的理解

发布时间:2011-02-15 21:45:33来源:红联作者:考乌特莫克
下面的代码编译运行后输出的结果是什么? same.还是diff. 呢?答案就不在帖子里写出来了,大家最好运行试试,如果发现结果和之前自己的推断不一致最好加几个断点看看内存里到底发生了什么。。。

#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;
}
文章评论

共有 14 条评论

  1. hml1006 于 2011-03-11 15:46:01发表:

    编译器要进行内存对齐

  2. linuxblack 于 2011-02-28 20:02:43发表:

    受益匪浅!!谢谢。。

  3. lunzhy 于 2011-02-23 09:18:34发表:

    曾经看过这方面的知识!确实存在这样容易疏忽的知识点。推荐看下《高质量程序设计》。
    另外像sizeof 与strlen也是不同的!

  4. lang1437 于 2011-02-22 11:48:36发表:

    自认为会点C的路过。。。回家面壁!

  5. 考乌特莫克 于 2011-02-18 23:05:29发表:

    希望大家平时能够多发一些关于编程方面心得和自我理解的帖子,而并不仅仅是一些书籍或者一些为了刷等级的简单回复。这样才能够有一个更好的学习氛围和环境,对于不理解的问题,首先尽量自己思考,google一下看是否能解决,实在不会可以发出来大家研究一下。

  6. 考乌特莫克 于 2011-02-18 22:54:33发表:

    8# pallana


    就是在这种结构体变量进行初始化的时候,最好使用memset,因为这样做是有保障的。因为你不知道代码在未来维护的时候,有什么改动,万一增加了一个类似于memcmp的比较,可能就有bug了。这些细节的问题,平时编程的时候,我们还真的要注意!

  7. 奶茶dsk 于 2011-02-18 13:35:59发表:

    {:3_114:} 这个和初始栈有关,

  8. pallana 于 2011-02-18 09:33:23发表:

    6# 考乌特莫克


    这个意思就是说,如果我们要赋值,最好就是使用memset来操作,否则可能会造成一些错误,对吧。

  9. naruto01 于 2011-02-17 22:29:51发表:

    扩展LS
    所以[code]char c1;
    int i1;
    char c2;[/code]与[code]char c1, c2;
    int i1;[/code]可能存在一些差距

  10. 考乌特莫克 于 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。你可以在比较的地方设置断点,然后看下内存里是不是又三个字节的垃圾数据,正是由于这个三个字节的垃圾
    数据,导致比较不相等。

  11. dchwlinux 于 2011-02-17 20:49:11发表:

    4# 考乌特莫克


    我猜是两个变量的类型不一样,char会转化成整型的ascii码,另一个是0的长整型,对不?

  12. 考乌特莫克 于 2011-02-17 19:39:43发表:

    3# dchwlinux


    正是diff。。。把代码放到vc里或者使用gdb调试跟踪一下,看看内存里的值。最好能够自己发现问题所在,那样对自己是一种提高。

  13. dchwlinux 于 2011-02-16 16:48:06发表:

    难道是diff?

  14. Junyi 于 2011-02-16 08:43:15发表:

    不懂C的路过