| 
 华为转正的题目:               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'                                         字符指针   |