| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3689 人关注过本帖
标题:请教static初始化与赋值的区别
只看楼主 加入收藏
mi53
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-10-3
结帖率:100%
收藏
已结贴  问题点数:14 回复次数:18 
请教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
oszc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:154
注 册:2011-4-15
收藏
得分:0 
static 只会初始化一次
2011-04-26 23:54
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-04-27 00:25
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:1 
程序代码:
void g(char *string)
{
    static char c=' ';    // 这条语句只会执行一次,第二次调用这个函数的时候不会将 c 的值赋为 ' '
    printf("%c %s ",c,string);
    c=',';
}
void g(char *string)
{
    static char c;
    c=' ';    // 这条语句每次调用这个函数时都会被执行,将 c 的值赋为 ' '
    printf("%c %s ",c,string);
    c=',';
}

关于 static 作用的真正原理我不像楼上那么清楚,这方面参考楼上回复
2011-04-27 01:09
cacker
该用户已被删除
收藏
得分:11 
提示: 作者被禁止或删除 内容自动屏蔽
2011-04-27 01:58
其实、不想说
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:122
专家分:156
注 册:2011-3-3
收藏
得分:0 
分配空间时间作用周期不同吧
2011-04-27 11:47
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
快速回复:请教static初始化与赋值的区别
数据加载中...
 
   



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

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