了解内存乱码(C)

时间:2019-01-30 15:00:18

标签: c memory

蝙蝠权,这个问题没有实际的目的,只是为了更好地理解记忆。 考虑以下代码:

char some[];
for(int i = 0; ; i++) {
        printf("%c", some[i]);
}

前9个字符相同,因为尚未初始化字符串,因此会打印出垃圾。现在,在字符串结尾之后,程序不会停止,即使这些字节不属于程序,并且操作系统应在循环的第11次迭代中终止该程序,它仍会继续打印char -s。

但这永远不会发生,在字符串打印后,它会继续前进。几乎每次长度都从几行cmd到有时大约一兆字节的文本都不同。所以,第一个问题

1。为什么每次运行程序时,访问第11个字节后OS都会花费随机的时间来杀死程序?怎么会在11日从未实现?

有些输出是完整的,像这样乱七八糟:

E  €E  !0  30  mE  Q   Е2  Е2  Ы0  Ы0          ч<           * * Ґ  “E  ЈE  ^  [1  #  #  Ґ  {  Ѓ  Ґ  ґ  с3  4  Ґ    ґE  Ј1  <4    w/  z/  U4        СE  zz            8    Љ  Љ  Ќ  Ќ  ђ  T$  Ќ  ђ      ™          Г  E9  ЯE  =F  UF  E9  zдR'<O.  -  YF    ^F  ^F  jF  jF  qF  vF  zF  F  ЌF  “F    qF    уF  /G  yG  yG          ­G              * * Ґ  ±G  ±G  ^  ЕG  ЛG  ХG  Ґ  аG  аG  Ґ    э9  ыG  Ґ    H  к  H  .          ;H      $  ?H  MM          [    EH  EH  Ќ  ђ  Ќ  IH  ђ  Ќ      ™  LH  TH  yH  ©H  ±H  ЙH  бH  зH  Mйэйэйэфq    -  нH     тH  ьH  I  I  I  I  I  I  -I  2I  DI  I     ‹I  ЙI  =J  ЃJ          ЇJ             * * Ґ  іJ  ЕJ  ^  a  #  #  Ґ  ФJ  ФJ  Ґ  ґ  хJ  K  Ґ  $  'K  DK  KK  q          YK  cK  0  ЃK   Ђ           я    Љ  Љ  3   ђ  Ќ  ‡K  ђ  Ќ      ™  ЊK  —K  Г  г  -  µK  Ґ$  Ї    йэйэйэфп   -  ё   +  »K  АK  ИK  ТK  ЬK  бK  еK  кK  юK  э   +  ЬK  +  YL  ЌL  щL  %M          щ#           * * Ґ  AM  QM  ^  a  #  #  Ґ  dM  dM  Ґ  [  П&  ЌL  Ґ  0  Ы  к  Х,  п          г,      =  hM   Ђ         "    Љ  Љ  3   Ќ  ђ  nM  Ќ  ђ      ™  њ     Г  г  qM  ЎM  ·M  Ї    йэйэйэфЩ   -  ё   8  »M  ЕM  РM  ЧM  ЯM  дM  иM  нM  уM  э   8  ЯM  8  7N  kN  ЭN  !O  їO  P  GP           * * Ґ  wP  ‰P  ^  ќP  #  #  Ґ  аG  аG  Ґ  [  П&  µP  Ґ  =  ЕP  к  KK  Щ          №1      N  ФP  ,,          в   Љ  Љ  3   Ќ  Q$  ЪP  Ќ  Q$      ™          Г  г  ыP  Q  Ґ$  E9  ,гb'ђQ   8
Q  Q  "  Q  .Q  ?Q  KQ  WQ  \Q  `Q  eQ  xQ  ‹Q  ќQ  WQ  E  нQ  R  R  ЩR  эR  S  US            * * Ґ  cS  ‡S  ^  a  #  #  Ґ   S  «S  Ґ  N  э9  R  Ґ  N  ±S  ЬS  KK     гS  жS  сS  щS  c  ФP  ,,           в   Љ  Љ  3   Ќ  ђ  ЪP  Ќ  ђ      ™  њ     Г  г  T  /T  Ґ$  Ї   ,жYa'©Q   7
Q  WQ  "  5T  JT  ?Q  VT  WQ  \Q  `Q  eQ  bT  uT  ќQ  WQ  Z  СT  U  gU  µU  %V      cV            * * Ґ  “V  ґV  ^  a  #  #  Ґ  НV  НV  Ґ  c  П&  U  Ґ  c  УV  к  юV   

此外,某些char-是空白方块。如果我没有记错的话,则意味着程序无法识别该符号。

2。给定ASCII表包含255个符号并且C char为1字节长,那怎么可能?为什么不显示扩展集中的字符?

但是,其他部分由有效词组成:

C o s t a   R i c a    C R I    C R    C R C    C o s t a   R i c a n   C o l у n    c o l у n   c o s t a r r i c e n s e    S p a n i s h   ( C o s t a   R i c a )    e s p a с o l   ( C o s t a   R i c a )   
 1 4 0 a : 0 0 0 0 0 8 0 a    E S K    C u b a    C U B    C U    C U P   
 C u b a n   P e s o    p e s o   c u b a n o    S p a n i s h   ( C u b a )    e s p a с o l   ( C u b a )   
 0 8 0 a : 0 0 0 0 0 8 0 a    E S D    D o m i n i c a n   R e p u b l i c    R e p ъ b l i c a   D o m i n i c a n a    D O M    D O P    D o m i n i c a n   P e s o    p e s o   d o m i n i c a n o    S p a n i s h   ( D o m i n i c a n   R e p u b l i c )    e s p a с o l   ( R e p ъ b l i c a   D o m i n i c a n a )   
 1 c 0 a : 0 0 0 0 0 8 0 a    E S F    E c u a d o r    E C U    E C    d у l a r   e s t a d o u n i d e n s e    S p a n i s h   ( E c u a d o r )    e s p a с o l   ( E c u a d o r )   
 3 0 0 a : 0 0 0 0 0 8 0 a   
 H H ' H ' m m . s s      Х1  Щ  цj  мj  ¦а     [   з1  [Ѕ  ЧE  #k  K6  йP  у     d d d d ,   d '   d e   ' M M M M '   d e   ' y y y y      Са   F  %F     H H ' H ' m m ' ' ' ' s s ' ' ' ' ' '      Х1  Щ  …  ча     E S N    d o .    l u .    m a .    m i .    j u .    v i .    s б .    б  !б  &б  +б  0б  5б  :б    # S p a n i s h   ( S p a i n ,   I n t e r n a t i o n a l   S o r t )   . e s p a с o l   ( E s p a с a ,   a l f a b e t i z a c i у n   i n t e r n a c i o n a l )    H H ' H ' m m    –  …  l  l  ¤б     L    X    J    V    РЕ  №б  -Н  јб  їб  Вб  оB    
 0 c 0 a : 0 0 0 0 0 4 0 a   ) k 0 - w i n d o w s - s p a n i s h ; k 0 - w i n d o w s - s p a n i s h - v a r    d d . M M M . y y y y      [   з1  [Ѕ  ЧE  K6  йP  у  в     l u n    j u e    GN  /в  QN  VN  4в  `N  eN     e n e    o c t    d i c     
 Iв  аO  QN  еO  кO  К  П  щO  Щ  Nв  Ю  Sв        ! S p a n i s h   ( S p a i n ,   T r a d i t i o n a l   S o r t )   , e s p a с o l   ( E s p a с a ,   a l f a b e t i z a c i у n   t r a d i c i o n a l )    H H ' H ' m m ' ' ' '    –  …  Жв     E q u a t o r i a l   G u i n e a    G u i n e a   E c u a t o r i a l    G N Q    G Q    f r a n c o   C F A   d e   Б f r i c a   C e n t r a l    S p a n i s h   ( E q u a t o r i a l   G u i n e a )    e s p a с o l   ( G u i n e a   E c u a t o r i a l )    Q    E S G       G u a t e m a l a    G T M    G T    G T Q    G u a t e m a l a n   Q u e t z a l    q u e t z a l    S p a n i s h   ( G u a t e m a l a )    e s p a с o l   ( G u a t e m a l a )   
 1 0 0 a : 0 0 0 0 0 8 0 a    d d d d   d d   ' d e '   M M M M   ' d e '   y y y y    d d   ' d e '   M M M M   ' d e '   y y y y      Щг  цг     E S H    H o n d u r a s    H N D    H N    H N L    H o n d u r a n   L e m p i r a    l e m p i r a   h o n d u r e с o    S p a n i s h   ( H o n d u r a s )    e s p a с o l   ( H o n d u r a s )   
 4 8 0 a : 0 0 0 0 0 8 0 a      И1  I   Х1  Щ     [   6ј  з1  [Ѕ  ЧE  K6  у     Са  %F     32  Ґ   Х1  Щ     E S M    M e x i c o    M й x i c o   

还有一次,我登陆了一些带有HTML标记的<> </>。我唯一能说的就是“汇编”。

3。假设所讨论的字节正在由其他程序使用,是否正确?

如果有关系,IDE是适用于Windows 10的Visual Studio Community 2017。

2 个答案:

答案 0 :(得分:0)

  
      
  1. 为什么每次运行程序时,操作系统都会在访问第11个字节后花随机的时间来杀死程序?怎么会在11日从未做到呢?
  2.   

您通过访问超出其边界的数组来调用undefined behavior。任何事情都会发生。

  
      
  1. 假设相关字节正在由其他程序使用是否正确?
  2.   

否,因为在现代操作系统上,以用户模式运行的进程将看到其自己的virtual address space。您将看到的是终端程序使用的任何字符集,都来自您自己进程的内存中的字节编码。

答案 1 :(得分:0)

首先,代码无法按原样编译,因为您不能在没有大小的情况下定义数组。

假设您确实修复了阵列:

char some[10];

读取数组的第10个元素将调用undefined behavior。这不保证会崩溃。这只是意味着您无法预测程序的行为。它可能会崩溃,它可能会输出奇怪的结果,或者它似乎可以正常工作。仅仅因为它会崩溃并不意味着会崩溃。

关于不打印扩展的ASCII字符,如何打印字符取决于您的终端。它可能会打印扩展的ASCII或尝试将字节解释为UTF8并相应地显示它们。

当OS为某个进程提供内存时,通常会先将该内存清零,然后再获取该进程,因此您看到的所有值都来自您的进程。其中一些可能是过程知道的环境变量,因此可以解释您看到的某些文本,但是您不能依赖于看到任何特定的东西,因为您已经调用了未定义的行为。