蝙蝠权,这个问题没有实际的目的,只是为了更好地理解记忆。 考虑以下代码:
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。
答案 0 :(得分:0)
- 为什么每次运行程序时,操作系统都会在访问第11个字节后花随机的时间来杀死程序?怎么会在11日从未做到呢?
您通过访问超出其边界的数组来调用undefined behavior。任何事情都会发生。
- 假设相关字节正在由其他程序使用是否正确?
否,因为在现代操作系统上,以用户模式运行的进程将看到其自己的virtual address space。您将看到的是终端程序使用的任何字符集,都来自您自己进程的内存中的字节编码。
答案 1 :(得分:0)
首先,代码无法按原样编译,因为您不能在没有大小的情况下定义数组。
假设您确实修复了阵列:
char some[10];
读取数组的第10个元素将调用undefined behavior。这不保证会崩溃。这只是意味着您无法预测程序的行为。它可能会崩溃,它可能会输出奇怪的结果,或者它似乎可以正常工作。仅仅因为它会崩溃并不意味着会崩溃。
关于不打印扩展的ASCII字符,如何打印字符取决于您的终端。它可能会打印扩展的ASCII或尝试将字节解释为UTF8并相应地显示它们。
当OS为某个进程提供内存时,通常会先将该内存清零,然后再获取该进程,因此您看到的所有值都来自您的进程。其中一些可能是过程知道的环境变量,因此可以解释您看到的某些文本,但是您不能依赖于看到任何特定的东西,因为您已经调用了未定义的行为。