</p> 例中3种情况或将两个判断条件调换了次序都会导致内存溢出。 1 R& D# n7 W* h4 u* H1 m5 A
4、关于混乱的类型扩展问题 ' J- e( \; Z( L9 U# H
因为不确定编译器采用哪种保护规则(无符号保护或是值保护),应尽量避免在同一个表达式内混用有符号和无符号的变量。任何时候,总可以用显式的类型转换来明确无误地表达所希望的转换的地方或方式。
4 @+ S" k [7 p. z5 r 5、类型转换被当成左值
" {/ s. _# v* _/ K0 s1 b: I 在C语言中,类型转换操作只能生成一个右值,不能被赋值或进行自增(减)运算。 # r2 z6 n) k& Z& E
如
( f3 w/ N' j4 g$ T S2 Z3 h+ A1 U: p char *p; % n r' O' ]# x1 ?6 N8 Z' ?
((int *)p)++;
3 h1 B* @- L* R& U4 K' s. |; V 不能完成预想中的将p增加一个int的长度,而应该如下:
( k( |0 S+ k2 _ p= (char *)((int *)p + 1);
) q$ p2 j) {" |8 ` 或p += sizeof(int); : `( ^! [8 S! `: O- `
6、变长参数函数调用中,会进行默认类型转换吗?
! r* V4 I* g( |; _( k 下面这段代码的输出是什么?
! I7 A& B! \4 }5 r( ]
8 a4 w1 ?6 D" P9 D2 V& B% J #include int main() 9 t6 o) G! v/ }+ F, C9 j
{
. z9 s4 \, B0 V __int64 n;
# F& k- y" \5 r5 E& O int b;
b0 m+ d t2 f/ z8 n- @- q n = 1;
U2 D) z: p# J2 o b = 2;
) B" z0 [1 G! i+ w( N* Z6 L' W printf(“%d,%d\n”,n,b);
( ^; p9 Q" I7 W3 f# z$ ? return 0;
. ~5 @% F0 x% k- n: z, c } 3 x9 S' _) ]* K& T. y6 P
和预料不同的是,它输出:1,0 9 s7 e4 i, e' M$ t
这是因为在可变参数函数调用中,一般编译器是不进行默认类型转换的,当函数根据格式字符串从栈中提取参数时就会由于变量长度不一致而产生异常的输出。 |