C中一些容易疏忽的问题
- 数组作为形参时退化为指针,即
sizeof(arg) = 8,不再是原先数组的大小
- 可以使用引用(CPP中),
f(int (&arg)[])
字符串定义方式的问题
char* a和char a[]类型不同,导致的结果不同:
extern char *a认为存储单元是地址的值
extern char a[]认为存在单元是数组元素,但是用的时候a是地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h> extern char a[]; extern char *b; extern unsigned int a_address(); extern unsigned int b_int(); int main() { if(*(unsigned int*)a==a_address()) printf("指针a被错误的认为是数组\n"); if((unsigned int)b==b_int()) printf("数组b被错误的认为是指针\n"); return 0; }
char *a="abcdefgh"; char b[]="ABCDEFGH";
unsigned int a_address() { return (unsigned int)a; }
unsigned int b_int() { return *(unsigned int *)b; }
|
64位和32位的问题
系统的内存布局,变量传递方式等都可能不同,导致64位系统和32位系统表现的结果不同。
1 2 3 4 5 6 7 8
| void f() { const float PI = 3.14159; int a[16]; a[16] = 3; printf("PI = %f\n",PI); }
|