zoukankan      html  css  js  c++  java
  • 指针和数组错用的问题汇总

    指针和数组名容易用错,本文记录常见的错误。

    错误用法一、定义时是数组,在其他文件中声明为指针。

    file a.c 中,定义b是一个数值:

     1 #include <stdio.h>
     2 
     3 char b[4] = {'1', '2', '3', '4'};
     4 
     5 void printinfilea(void)
     6 {
     7     printf("in a.c, b=0x%x, first addr=0x%x \n", b, &b[0]);
     8 
     9     return;
    10 }

    文件 b.c 中声明b为指针:

    #include <stdio.h>
    
    extern char *b;
    
    void printinfileb(void)
    {
        printf("in b.c, b=0x%x \n", b);
    
        return;
    }

    文件 main.c 

     1 #include <stdio.h>
     2 
     3 
     4 int main()
     5 {
     6     printinfilea();
     7     printinfileb();
     8     
     9     return 0;
    10 }


    在cygwin中运行结果如下:

    h@he-c9c1ddb921eb ~/test/ptr-array
    $ gcc -mbig -o test  a.c b.c main.c
    $ ./test
    in a.c, b=0x402000, first addr=0x402000
    in b.c, b=0x34333231

    总结一下:

    在a.c中定义的数组,其数组名(b)只是一个名字,不占用物理的内存区域,只是编译、运行时代表数组的起始地址;

    而在b.c中认为b是一个全局变量,指针类型的全局变量,所以,打印b的值,就是打印指针变量中存储的值,所以,就是字符'1','2','3','4'组成的数字。

    其实,如果在b.c中打印 &b的值(printf("in b.c, b=0x%x &b=0x%x\n", b, &b);),得到的数值也是0x402000, 如下:

    h@he-c9c1ddb921eb ~/test/ptr-array
    $ ./test
    in a.c, b=0x402000, first addr=0x402000
    in b.c, b=0x34333231 &b=0x402000

    问题解决、规避方法:

    在头文件 a.h 中对外声明 extern char b[], 其他源文件,凡是需要使用b的,只能包含头文件a.h ,不允许显式的extern ...

  • 相关阅读:
    认知实习(杭钢、杭州中萃)
    Head of a Gang (map+邻接表+DFS)
    Sharing
    Hello World for U (20)
    计算器(delphi)
    CentOS 下 Codeblocks 的 安装 + 汉化 以及 基本使用介绍
    关于阿里如何吸引大学生用户理财的一些个人看法
    分页 存储过程
    点击退出,并未直接跳转到登陆界面,登录界面还停留在框架集界面
    梦幻之旅--地图编辑器开发
  • 原文地址:https://www.cnblogs.com/zhouhaibing/p/2923013.html
Copyright © 2011-2022 走看看