strcat和strncat的顺序的影响
为何同一个字符串在strncat的前后输出结果会不一样;代码如下图:
输出结果如下图:
倒数第三行去掉试试 lovefishc.com 发表于 2018-5-6 22:22
倒数第三行去掉试试
我有一个打印错误第二个printf 括号内应该是 ("str1: %s\n",str1);
我想知道为什么strncat对str1没有进行操作, 但是前后两次输出str1为什么会不一样? 是不是内存中线性存储的问题,俺也理解的也不是很清楚 倒数第三行把16改成9,,,越界了 lovefishc.com 发表于 2018-5-7 16:26
倒数第三行把16改成9,,,越界了
http://bbs.fishc.com/home.php?mod=space&uid=438949&do=album&picid=9729&goto=down#pic_block
http://bbs.fishc.com/home.php?mod=space&uid=438949&do=album&picid=9730&goto=up#pic_block
str1的结果还是这样{:5_96:} 为什呀? 看反汇编吧,如果看不懂,那就等学完汇编语言以后,再回来看
1 .file "main.c"
9 .Ltext0:
10 .cfi_sections .debug_frame
11 .section .rodata
12 .LC2:
13 0000 2000 .string " "
14 .LC3:
15 0002 73747231 .string "str1: %s\n"
15 3A202573
15 0A00
16 .LC4:
17 000c 73747233 .string "str3: %s\n"
17 3A202573
17 0A00
18 .LC0:
19 0016 796F7500 .string "you"
20 .LC1:
21 001a 446F2079 .string "Do you "
21 6F752000
22 .text
23 .globl main
25 main:
26 .LFB0:
27 .file 1 "main.c"
0:main.c **** #include <stdio.h>
1:main.c **** #include <string.h>
2:main.c ****
3:main.c **** int main(void)
4:main.c **** {
28 .loc 1 5 0
29 .cfi_startproc
30 0000 55 pushl %ebp
31 .cfi_def_cfa_offset 8
32 .cfi_offset 5, -8
33 0001 89E5 movl %esp, %ebp
34 .cfi_def_cfa_register 5
35 0003 83E4F0 andl $-16, %esp
36 0006 83EC30 subl $48, %esp
5:main.c **** char str1[] = "I love";
37 .loc 1 6 0
38 0009 C7442429 movl $1869357129, 41(%esp)
38 49206C6F
39 0011 66C74424 movw $25974, 45(%esp)
39 2D7665
40 0018 C644242F movb $0, 47(%esp)
40 00
6:main.c **** char str2[] = "you";
41 .loc 1 7 0
42 001d A1160000 movl .LC0, %eax
42 00
43 0022 89442425 movl %eax, 37(%esp)
7:main.c **** char str3[] = "Do you ";
44 .loc 1 8 0
45 0026 A11A0000 movl .LC1, %eax
45 00
46 002b 8B151E00 movl .LC1+4, %edx
46 0000
47 0031 8944241D movl %eax, 29(%esp)
48 0035 89542421 movl %edx, 33(%esp)
8:main.c **** char str4[] = "love me ?";
49 .loc 1 9 0
50 0039 C7442413 movl $1702260588, 19(%esp)
50 6C6F7665
51 0041 C7442417 movl $543517984, 23(%esp)
51 206D6520
52 0049 66C74424 movw $63, 27(%esp)
52 1B3F00
9:main.c ****
10:main.c **** strcat(str1, " ");
53 .loc 1 11 0
54 0050 B8000000 movl $.LC2, %eax
54 00
55 0055 89442404 movl %eax, 4(%esp)
56 0059 8D442429 leal 41(%esp), %eax
57 005d 890424 movl %eax, (%esp)
58 0060 E8FCFFFF call strcat
58 FF
11:main.c **** strcat(str1, str2);
59 .loc 1 12 0
60 0065 8D442425 leal 37(%esp), %eax
61 0069 89442404 movl %eax, 4(%esp)
62 006d 8D442429 leal 41(%esp), %eax
63 0071 890424 movl %eax, (%esp)
64 0074 E8FCFFFF call strcat
64 FF
12:main.c **** printf("str1: %s\n", str1);
65 .loc 1 13 0
66 0079 B8020000 movl $.LC3, %eax
66 00
67 007e 8D542429 leal 41(%esp), %edx
68 0082 89542404 movl %edx, 4(%esp)
69 0086 890424 movl %eax, (%esp)
70 0089 E8FCFFFF call printf
70 FF
13:main.c ****
14:main.c **** strncat(str3, str4, 16);
71 .loc 1 15 0
72 008e 8D442413 leal 19(%esp), %eax
73 0092 C7442408 movl $16, 8(%esp)
73 10000000
74 009a 89442404 movl %eax, 4(%esp)
75 009e 8D44241D leal 29(%esp), %eax
76 00a2 890424 movl %eax, (%esp)
77 00a5 E8FCFFFF call strncat
77 FF
15:main.c **** printf("str1: %s\n", str1);
78 .loc 1 16 0
79 00aa B8020000 movl $.LC3, %eax
79 00
80 00af 8D542429 leal 41(%esp), %edx
81 00b3 89542404 movl %edx, 4(%esp)
82 00b7 890424 movl %eax, (%esp)
83 00ba E8FCFFFF call printf
83 FF
16:main.c **** printf("str3: %s\n", str3);
84 .loc 1 17 0
85 00bf B80C0000 movl $.LC4, %eax
85 00
86 00c4 8D54241D leal 29(%esp), %edx
87 00c8 89542404 movl %edx, 4(%esp)
88 00cc 890424 movl %eax, (%esp)
89 00cf E8FCFFFF call printf
89 FF
17:main.c ****
18:main.c **** return 0;
90 .loc 1 19 0
91 00d4 B8000000 movl $0, %eax
91 00
19:main.c **** }
92 .loc 1 20 0
93 00d9 C9 leave
94 .cfi_restore 5
95 .cfi_def_cfa 4, 4
96 00da C3 ret
97 .cfi_endproc
98 .LFE0:
100 .Letext0:
我理解了,画了一张图,不知道你能不能理解
人造人 发表于 2018-5-10 14:41
我理解了,画了一张图,不知道你能不能理解
str1为什么会显示str3后面的内容呢? LordHdy 发表于 2018-5-10 22:40
str1为什么会显示str3后面的内容呢?
在执行 strcat(str1, " "); 之前,内存中是这样的,能理解吗
str4 排在 str3 的前面,str3 排在 str2 的前面
人造人 发表于 2018-5-10 23:03
在执行 strcat(str1, " "); 之前,内存中是这样的,能理解吗
str4 排在 str3 的前面,str3 排在 str2 的 ...
非常感谢!
页:
[1]