Chinaunix

标题: 请问:一个字符串的问题 [打印本页]

作者: netdoger    时间: 2016-06-20 15:31
标题: 请问:一个字符串的问题
请看:
char str[1];
strcpy(str,"Hello World");
printf("str=%s\n",str);
printf("str=%c %c %c %c %c\n",str[0],str[1],str[2],str{3],str[4],str[5]);
我觉得很奇怪,char str[1]定义只有一个字符,为什么
strcpy(str,"Hello World");不会出错?
另外:str只有定义一个字符,为什么
str[0],str[1],str[2],str{3],str[4],str[5]也能输出?
系统难道不检查吗?这样写代码可以吗
作者: windoze    时间: 2016-06-20 15:38
尽管有一堆法律法规,可是红灯依然拦不住行人乱穿马路。
很大概率你不会被撞死。
作者: netdoger    时间: 2016-06-20 16:06
回复 2# windoze
什么意思?能不能说说这些代码怎么回事

   
作者: hellioncu    时间: 2016-06-20 16:46
你把"Hello World"改得很长一般就会出错了
作者: 残愚    时间: 2016-06-21 09:14
  1. lea        0xffffffffffffffef(%rbp), %rax
  2. movl     $0x6c6c6568, (%rax)   //lleh  我的程序里是“hello world”,不是“Hello world”
  3. movl     $0x6f77206f, 0x4(%rax) //ow o
  4. movl     $0x646c72, 0x8(%rax)//dlr
  5. lea        0xffffffffffffffef(%rbp), %rsi
  6. mov      $0x400668, %edi
  7. mov      $0x0, %eax
  8. callq      400398 <printf@plt>
  9. movzbl  0xfffffffffffffff9(%rbp), %eax
  10. movsbl  %al, %edx
  11. movzbl  0xfffffffffffffff8(%rbp), %eax
  12. movsbl  %al, %ecx
  13. movzbl  0xfffffffffffffff7(%rbp), %eax
  14. movsbl  %al, %esi
  15. movzbl  0xfffffffffffffff6(%rbp), %eax
  16. movsbl  %al, %edi
  17. movzbl  0xfffffffffffffff5(%rbp), %eax
  18. movsbl  %al, %r8d
  19. movzbl  0xfffffffffffffff4(%rbp), %eax
  20. movsbl  %al, %r9d
  21. movzbl  0xfffffffffffffff3(%rbp), %eax
  22. movsbl  %al, %r10d
  23. movzbl  0xfffffffffffffff2(%rbp), %eax
  24. movsbl  %al, %r11d
  25. movzbl  0xfffffffffffffff1(%rbp), %eax
  26. movsbl  %al, %ebx
  27. movzbl  0xfffffffffffffff0(%rbp), %eax
  28. movsbl  %al, %r12d
  29. movzbl  0xffffffffffffffef(%rbp), %eax
  30. movsbl  %al, %eax
复制代码

作者: cjfeii    时间: 2016-07-22 16:40
系统分配内存的时候,不是一个字节一个字节分配的。
作者: cjfeii    时间: 2016-07-24 10:10
你可以试一下2楼的做法,可能会得到崩溃的结果。
尽量不要这样用,在不同的环境下你可能得到的结果是不同的,这种不确定性要尽量在我们的程序中去避免。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2