之前有在外面面试,遇到一题如下:

  1. filea.c
  2. char *p = "abcdefg";
  3.  
  4. fileb.c
  5. extern char p[];
  6. printf("p[0]=%d\n", p[]);
  7. result=?

当时只是纠结于printf中的%d打印char类型数据,会不会按地址将abcd这四个字节的数据打印出来,所以给出的答案是:0x61626364.

类似的还有这种做法:

  1. filea.c
  2. char p[];
  3.  
  4. fileb.c
  5. extern char p[];
  6. extern char *p;
  7. p[] = ?

上面这个char p[10], p只是个别名,下面的extern char *p提取p的地址可能是0,然后对p[0]赋值可能导致程序崩溃。

之后,回来查了些资料,写了个代码试了下:

filea.c

  1. char *str = "abcdefg";

fileb.c

  1. #include "stdio.h"
  2.  
  3. extern char str[];
  4. char *str2 = "abcdef";
  5.  
  6. void main(void)
  7. {
  8. int i = ;
  9.  
  10. printf("str1:addr=0x%08x, %d, %d, %d\n", (unsigned int)str, str[], str[], str[]);
  11.  
  12. printf("str2\n");
  13. for(i = ; i < sizeof(str2); i++)
  14. {
  15. printf("[%d]=%c ", i, str2[i]);
  16. }
  17. }

Makefile

  1. objects = filea.o fileb.o
  2. hello:$(objects)
  3. gcc -o hello $(objects)
  4. filea.o: filea.c
  5. fileb.o: fileb.c
  6. clean:
  7. rm hello $(objects)

Result:

  1. str:addr=0x00601048, -, ,
  2. str2
  3. []=a []=b []=c []=d []=e []=f []= []=s %

可以看出str的输出并不是我们想要的。

为什么呢?

首先,关于指针和数组名

  • 系统会为“指针名”分配4个字节的内存空间。存放指针的内存空间和该内存中存放的数据,前者为存放指针的地址,后者为存放有效数据(如abcdef)的地址。
  • 而数组名则不会,数组名只是一块存放数据地址空间的别名。

其次,由于在fileb.c中extern char str[]; str被申明为数组,那么str就是代表一块地址空间的别名,也就是存放str指针地址空间的别名,而不是上面说道的有效数据的地址空间,所以str[0]只是存放abcdef地址空间的值。

结论:使用声明和定义要匹配。

[基础]关于extern指针和数组的用法的更多相关文章

  1. 浅谈C语言 extern 指针与数组

    /* * d.c * * Created on: Nov 15, 2011 * Author: root */ #include "apue.h" int a[] = {3,2}; ...

  2. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

    小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...

  3. C语言基础:指针类型与指针和数组、字符串的关系

    //指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的 ...

  4. C++ | C++ 基础知识 | 指针、数组与引用

    1.指针 在 C++ 语言中存放及使用内存地址是通过指针和引用完成的. char c = 'a'; // 声明 c 变量,c 变量存储的是 'a' 的值. char* p = &c; // 声 ...

  5. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  6. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

  7. C语言指针与数组

    C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝    -- Stan Kelly-Bootle   1. 数组并非指针 为什么很多人会认为指 ...

  8. 指针与数组的区别 —— 《C语言深度剖析》读书心得

    原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...

  9. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

随机推荐

  1. Why does Typescript use the keyword “export” to make classes and interfaces public?

    原文: https://stackoverflow.com/questions/15760462/why-does-typescript-use-the-keyword-export-to-make- ...

  2. 【转】Android:最全面的 Webview 详解

    原文: https://blog.csdn.net/carson_ho/article/details/52693322 前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电 ...

  3. WeifenLuo.WinFormsUI.Docking添加关闭功能

    /****************************************************************** * 创建人:HTL * 创建时间:2014-7-8 15:37: ...

  4. XPath查找节点值示例

    下面一个XML文档,需要找到粗体部分文字: <?xml version='1.0' encoding='utf-8'?> <rep sts="OK" a=&quo ...

  5. Git使用帮助

    1. 本地创建新项目 git init git add . git commit -m "First commit" 2. 本地代码同步Push到远程仓库 git remote a ...

  6. 【Android】读取sdcard上的图片

    Android读取sdcard上的图片是很easy的事情,以下用一个样例来说明这个问题. 首先,在sdcard上有一张已经准备好的img25.jpg 以下,须要做的是把这张图片读取到app中显示. 做 ...

  7. Jquery—Jquery中的(function($){...})(jQuery)

    当你第一眼看到"(function($){...})(jQuery)"的时候.你有什么感觉?呵呵呵,我当时还是止不住的从心底里骂了一句--操,这他妈什么劳什子.时过境迁,对于如今无 ...

  8. chrome更改缓存位置

      更改chrome浏览器缓存位置 CreateTime--2017年7月20日08:33:14Author:Marydon 一.参考链接 http://jingyan.baidu.com/artic ...

  9. 16-spring学习-配置文件操作

    实际使用:配置文件 spring的核心就是一个配置文件.所以只有将表达式应用到配置文件上才会特别有意义. 范例:利用配置文件,编写表达式应用 <bean id="str" c ...

  10. 如何发布本地maven项目jar包部署到nexus私服?

    首先在我们的pom里面描述我们要部署的地址: <distributionManagement> <repository> <id>release</id> ...