首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言代码分析解决思路

2012-04-17 
C语言代码分析int main_4(){char a[16]char b[16]char c[32]strcpy(a,0123456789abcdef)strcpy(b,0

C语言代码分析
int main_4() 
 { 
  char a[16];
char b[16];
char c[32];

strcpy(a,"0123456789abcdef");
strcpy(b,"0123456789abcdef");
strcpy(c,a);
strcat(c,b);
printf(" a=%s\n b=%s\n c=%s\n",a,b,c);
return(0);
}

麻烦大家给我分析一下,这输出结果应该是什么,能不能详细解释一下

[解决办法]
a=0123456789abcdef
 b=0123456789abcdef
 c=0123456789abcdef0123456789abcdef

[解决办法]
越界了,最后的\0放哪呢?
[解决办法]
strcpy(a,"0123456789abcdef");
strcpy(b,"0123456789abcdef");
这两句就导致越界了哦!
[解决办法]

探讨

麻烦你去用VC6.0试一下,结果不是这样的。

a=
b=0123456789abcdef
c=0123456789abcdef
Press any key to continue

[解决办法]
探讨
这是为什么呢

[解决办法]
差不多就是这个意思,越界了,修改了不应该修改的内存的内容
[解决办法]
在vs2010下运行正确,vc6,下a不输入结果
vc6的反汇编代码:
Assembly code
    TITLE    str.c    .386Pinclude listing.incif @Version gt 510.model FLATelse_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'_TEXT    ENDS_DATA    SEGMENT DWORD USE32 PUBLIC 'DATA'_DATA    ENDSCONST    SEGMENT DWORD USE32 PUBLIC 'CONST'CONST    ENDS_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'_BSS    ENDS_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'_TLS    ENDSFLAT    GROUP _DATA, CONST, _BSS    ASSUME    CS: FLAT, DS: FLAT, SS: FLATendifPUBLIC    _mainEXTRN    _strcpy:NEAREXTRN    _strcat:NEAREXTRN    _printf:NEAR_DATA    SEGMENT$SG35    DB    '0123456789abcdef', 00H    ORG $+3$SG36    DB    '0123456789abcdef', 00H    ORG $+3$SG39    DB    'a=%s', 0aH, ' b=%s', 0aH, ' c=%s', 0aH, 00H_DATA    ENDS_TEXT    SEGMENT_a$ = -16_b$ = -32_c$ = -64_main    PROC NEAR; File str.c; Line 2    push    ebp    mov    ebp, esp    sub    esp, 64                    ; 00000040H; Line 7    push    OFFSET FLAT:$SG35    lea    eax, DWORD PTR _a$[ebp]    push    eax    call    _strcpy    add    esp, 8; Line 8    push    OFFSET FLAT:$SG36    lea    ecx, DWORD PTR _b$[ebp]    push    ecx    call    _strcpy    add    esp, 8; Line 9    lea    edx, DWORD PTR _a$[ebp]    push    edx    lea    eax, DWORD PTR _c$[ebp]    push    eax    call    _strcpy    add    esp, 8; Line 10    lea    ecx, DWORD PTR _b$[ebp]    push    ecx    lea    edx, DWORD PTR _c$[ebp]    push    edx    call    _strcat    add    esp, 8; Line 11    lea    eax, DWORD PTR _c$[ebp]    push    eax    lea    ecx, DWORD PTR _b$[ebp]    push    ecx    lea    edx, DWORD PTR _a$[ebp]    push    edx    push    OFFSET FLAT:$SG39    call    _printf    add    esp, 16                    ; 00000010H; Line 12    xor    eax, eax; Line 13    mov    esp, ebp    pop    ebp    ret    0_main    ENDP_TEXT    ENDSEND
[解决办法]
楼主在定义主函数时,为什么要定义int main_4()而不是int main()?
输出结果与楼主说的一样。
1.楼主定义的数组长度不够,但是a[16],b[16]不应一样吗?为什么a[]没有结果,b[]有结果?
2.“\0”在开始?不是在数组的结尾吗?
在我的理解里,这三个数组都定义的不合适,为什么只有a[]才体现?
求楼下解释。
探讨
int main_4()
{
char a[16];
char b[16];
char c[32];

strcpy(a,"0123456789abcdef");
strcpy(b,"0123456789abcdef");
strcpy(c,a);
strcat(c,b);
printf(" a=%s\n b=%s\n c=%s\n",a,b,c);


return(……

热点排行