华为转正的题目: file1.c char g_table[100] = {0,1,2,3,4}; file2.c extern char* g_table; main() { printf("%x", g_table) } 与sun公司的一道面试题基本上一样 /* file1.c */ char buff[128]; /* file2.c */
extern char *buff; /* Notice: extern char buff[] */ int main()
{ *buff = 'a'; return 0; } 结果如下: $ gcc file1.c -c $ gcc file2.c -c $ gcc file1.o file2.o -o ff $ ./ff Segmentation Fault 解释: 1.数组名只是一个符号,不会被分配存储空间。而char *声明的是一个指针变量,会被分配空间。 2.当将数组名被外部引用声明为字符指针的时候,这个指针变量的存储空间就是数组的前四个字符(因为一般的地址为4个字节) 3.结果分析:华为的输出应为前四个元素的ASC值的十六进制表示,SUN公司的面试题应该是由于buf的内容是一个无效的地址,所以*buf取buf所指向存储单元的内容的时候会报错。
/* file2.c */
extern char *buff; /* Notice: extern char buff[] */ int main()
{ *buff = 'a'; return 0; } 结果如下: $ gcc file1.c -c $ gcc file2.c -c $ gcc file1.o file2.o -o ff $ ./ff Segmentation Fault 解释: 1.数组名只是一个符号,不会被分配存储空间。而char *声明的是一个指针变量,会被分配空间。 2.当将数组名被外部引用声明为字符指针的时候,这个指针变量的存储空间就是数组的前四个字符(因为一般的地址为4个字节) 3.结果分析:华为的输出应为前四个元素的ASC值的十六进制表示,SUN公司的面试题应该是由于buf的内容是一个无效的地址,所以*buf取buf所指向存储单元的内容的时候会报错。
a数组中存'abcd' 字符指针 |