| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3689 人关注过本帖
标题:请教static初始化与赋值的区别
取消只看楼主 加入收藏
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
结帖率:100%
收藏
已结贴  问题点数:14 回复次数:7 
请教static初始化与赋值的区别
请问:
程序代码:
#include<stdio.h>
void g(char *string);
int main()
{
    char *s="a";
    int i=10;

    while(--i){
        g(s);
    }
    printf("\n");
    return 0;
}
void g(char *string)
{
    static char c=' ';
    printf("%c %s ",c,string);
    c=',';
}
            


程序代码:
#include<stdio.h>
void g(char *string);
int main()
{
    char *s="a";
    int i=10;

    while(--i){
        g(s);
    }
    printf("\n");
    return 0;
}
void g(char *string)
{
    static char c;
    c=' ';
    printf("%c %s ",c,string);
    c=',';
}
的输出结果为什么不一样呢?
搜索更多相关主题的帖子: static 
2011-04-26 23:50
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
回复 5楼 cacker
这是我反汇编后的代码,能麻烦解释一下吗?
第一个程序的
程序代码:
1:    #include<stdio.h>
2:    void g(char *string);
3:    int main()
4:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,48h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-48h]
0040102C   mov         ecx,12h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
5:        char *s="a";
00401038   mov         dword ptr [ebp-4],offset string "a" (00422020)
6:        int i=10;
0040103F   mov         dword ptr [ebp-8],0Ah
7:
8:        while(--i){
00401046   mov         eax,dword ptr [ebp-8]
00401049   sub         eax,1
0040104C   mov         dword ptr [ebp-8],eax
0040104F   cmp         dword ptr [ebp-8],0
00401053   je          main+43h (00401063)
9:            g(s);
00401055   mov         ecx,dword ptr [ebp-4]
00401058   push        ecx
00401059   call        @ILT+0(_g) (00401005)
0040105E   add         esp,4
10:       }
00401061   jmp         main+26h (00401046)
11:       printf("\n");
00401063   push        offset string "\n" (0042201c)
00401068   call        printf (00401100)
0040106D   add         esp,4
12:       return 0;
00401070   xor         eax,eax
13:   }
00401072   pop         edi
00401073   pop         esi
00401074   pop         ebx
00401075   add         esp,48h
00401078   cmp         ebp,esp
0040107A   call        __chkesp (00401180)
0040107F   mov         esp,ebp
00401081   pop         ebp
00401082   ret


这是第二个
程序代码:
1:    #include<stdio.h>
2:    void g(char *string);
3:    int main()
4:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,48h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-48h]
0040102C   mov         ecx,12h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
5:        char *s="a";
00401038   mov         dword ptr [ebp-4],offset string "a" (00422020)
6:        int i=10;
0040103F   mov         dword ptr [ebp-8],0Ah
7:
8:        while(--i){
00401046   mov         eax,dword ptr [ebp-8]
00401049   sub         eax,1
0040104C   mov         dword ptr [ebp-8],eax
0040104F   cmp         dword ptr [ebp-8],0
00401053   je          main+43h (00401063)
9:            g(s);
00401055   mov         ecx,dword ptr [ebp-4]
00401058   push        ecx
00401059   call        @ILT+0(_g) (00401005)
0040105E   add         esp,4
10:       }
00401061   jmp         main+26h (00401046)
11:       printf("\n");
00401063   push        offset string "\n" (0042201c)
00401068   call        printf (00401100)
0040106D   add         esp,4
12:       return 0;
00401070   xor         eax,eax
13:   }
00401072   pop         edi
00401073   pop         esi
00401074   pop         ebx
00401075   add         esp,48h
00401078   cmp         ebp,esp
0040107A   call        __chkesp (00401180)
0040107F   mov         esp,ebp
00401081   pop         ebp
00401082   ret
2011-04-27 14:29
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
回复 4楼 voidx
还是cacker他回答的专业
2011-04-27 14:30
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
回复 6楼 其实、不想说
可以解释的再详细一点吗?
2011-04-27 14:30
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
回复 2楼 oszc
可以解释的再详细点嘛?
2011-04-27 14:31
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
以下是引用吴军林在2011-4-27 16:35:06的发言:

详细一点就是:
static char c ;和static char c =‘ ’;这两个都是定义c为局部静态变量,这两个语句都是在你编译的时候就赋初值
,而且只赋一次初值,以后c的值就是保持上一次函数调用结束时的值,而不是再一次重新赋值。
void g(char *string)
{
    static char c=' ';
    printf("%c %s ",c,string);
    c=',';
}
这段函数的执行过程是;
第一次,c=‘ ’;(这是在编译的时候就完成的,只执行一次)      输出c      c=‘,’;

解释的挺仔细。但感觉你这一句好像是笔误吧,第一个程序是先打一个空格,后面才是逗号
2011-04-27 23:21
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
回复 13楼 你们都要疼我哦
我觉得啊我就不该把反汇编问题贴出来去问人。论坛就是大家把问题提出来,然后大家给点思路,最后还是靠自己去研究。觉得该结贴了。
谢谢所有热心回答的网友。
2011-04-27 23:26
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
收藏
得分:0 
回复 17楼 cacker
谢谢了,下次遇到const的问题再来请教。
2011-04-28 14:28
快速回复:请教static初始化与赋值的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044498 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved