精华内容
下载资源
问答
  • 局部静态变量,会有些特殊,它不会随着作用域结束而消失,在进入作用于之前就已经存在。局部静态变量和全局变量都保存在二进制文件的数据区,而在代码中的限制,不过是编译器限制而已。那么当某个函...

    静态变量可以分为全局静态变量,和局部静态变量,先来说说全局的吧

    全局静态变量和全局变量的区别并不大,只是全局静态变量只能在当前文件中使用,而在反汇编中二者并无区别,只可以在当前文件中使用,不过是编译器做出的限制。

    局部静态变量,会有些特殊,它不会随着作用域结束而消失,在未进入作用于之前就已经存在。

    局部静态变量和全局变量都保存在二进制文件的数据区,而在代码中的限制,不过是编译器限制而已。

    那么当某个函数频繁调用局部静态变量时,C++的语法规定局部静态变量只能初始化一次,那么编译器是怎么做到的呢。

    来看代码:

    void ShowStatic(int nNum)
    {
    static int gnNumber = nNum;
    printf("%dn", gnNumber);
    }
    
    void main()
    {
       ShowStatic(99);
    }

    汇编代码:

    00E51738  mov         eax,dword ptr ds:[00E5A148h]  
    00E5173D  and         eax,1  
    00E51740  jne         ShowStatic+47h (0E51757h)  
    00E51742  mov         eax,dword ptr ds:[00E5A148h]  
    00E51747  or          eax,1  
    00E5174A  mov         dword ptr ds:[00E5A148h],eax  
    00E5174F  mov         eax,dword ptr [nNum]  
    00E51752  mov         dword ptr [gnNumber (0E5A144h)],eax  

    可以看出,静态变量的赋值比普通变量赋值多了很多步骤,我们来分析下。

    首先在地址00E5A148h中保存了局部静态变量的标志,这个标志占1个字节。

    通过位运算,将标志中的一位数据置1,来判断局部静态变量是否初始化过。

    而这个标志可以同时保存8个局部静态变量的初始状态。

    通常这个标志出现在最先定义的局部静态变量的附近,例如此例局部变量应出现在 00E5A144h 或 00E5A14Ch中。

    当同一个作用域内超过了8个静态局部变量,下一个标记将会除了现在第9个定义的局部静态变量地址的附近。

    现在再来看上面的汇编代码就很清晰了:

    00E51738  mov         eax,dword ptr ds:[00E5A148h]  
    00E5173D  and         eax,1  
    00E51740  jne         ShowStatic+47h (0E51757h)  

    判断是否已经初始化,如果已经初始化就跳转到printf输出内容,否则不跳转继续执行。

    00E51742  mov         eax,dword ptr ds:[00E5A148h]  
    00E51747  or          eax,1  
    00E5174A  mov         dword ptr ds:[00E5A148h],eax  
    00E5174F  mov         eax,dword ptr [nNum]  
    00E51752  mov         dword ptr [gnNumber (0E5A144h)],eax  

    未初始化的情况,将标志位置位为1,并初始化gnNumber。

    结束了?并没有

    还有这样一个问题,编译器让其他作用域对局部静态变量不可见,这是怎么做到的?

    在编译的过程中,编译器会对变量,函数等进行名称粉碎,也就是静态变量被重新命名了。

    读者可将上面的代码编译链接,然后找到编译期结束后生成的obj文件,在这个文件中搜索静态变量的名字(本文用HxD软件打开obj文件),搜索结果如下图:

    537ec07bc325947fc83d48b9c2d7af69.png

    名称粉碎后,在原有名称中加加入了一些额外信息,入作用域,类型等。

    像C++重载也是名称粉碎的原理。

    下面的汇编是在C++11中编译的结果,显然和上文的有些差距:

    static int gnNumber = nNum;
    00C11818  mov         eax,dword ptr [_tls_index (0C1B190h)]  
    00C1181D  mov         ecx,dword ptr fs:[2Ch]  
    00C11824  mov         edx,dword ptr [ecx+eax*4]  
    00C11827  mov         eax,dword ptr ds:[00C1B150h]  
    00C1182C  cmp         eax,dword ptr [edx+104h]  
    00C11832  jle         ShowStatic+6Fh (0C1185Fh)  
    00C11834  push        0C1B150h  
    00C11839  call        __Init_thread_header (0C110DCh)  
    00C1183E  add         esp,4  
    00C11841  cmp         dword ptr ds:[0C1B150h],0FFFFFFFFh  
    00C11848  jne         ShowStatic+6Fh (0C1185Fh)  
    00C1184A  mov         eax,dword ptr [nNum]  
    00C1184D  mov         dword ptr [gnNumber (0C1B14Ch)],eax  
    00C11852  push        0C1B150h  
    00C11857  call        __Init_thread_footer (0C11177h)  
    00C1185C  add         esp,4

    前三行代码:

    00C11818  mov         eax,dword ptr [_tls_index (0C1B190h)]  
    00C1181D  mov         ecx,dword ptr fs:[2Ch]  
    00C11824  mov         edx,dword ptr [ecx+eax*4]  

    TLS?怎么还多了两个函数?__Init_thread_header和_Init_thread_footer

    这两个函数是用来保证局部的静态对象的初始化线程安全。

    但局部变量的互斥还是老样子,只不过被封装进上述的两个函数之中了。

    有兴趣的读者可以自己上机调试一番。

    c5941b354b94596bcf3535a781bec223.png
    展开全文
  • 静态变量和局部变量初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题。什么是初始化初始化指的是对数据对象或者变量赋予初始值。例如:intvalue=8;//声明整型变量并初始化为8intarr[]...
    作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。

    前言

    什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题。

    什么是初始化

    初始化指的是对数据对象或者变量赋予初始值。例如:

    int value = 8//声明整型变量并初始化为8
    int arr[] = {1,2,3}; //声明整型数组arr,并初始化其值为1,2,3

    为什么要初始化

    我们来看一个示例程序。
    test0.c程序清单如下:

    #include 
    #include 
    int main(void){
        int sum;
        int randNum;
        while(10 > sum)
        {
            randNum =  rand() % 10;

            sum += randNum;
            printf("rand num is %d,sum is %d
    "
    ,randNum,sum);
        }
        printf("the final sum is %d
    "
    ,sum);
        return 0;
    }

    程序随机产生0到9的数字,使得sum的值大于或等于10时,退出程序。
    编译并运行:

    gcc  -o test0 test0.c
    ./test0

    运行结果如下(每次运行结果可能不同):

    rand num is 3,sum is -4040865
    rand num is 6,sum is -4040859
    rand num is 7,sum is -4040852
    rand num is 5,sum is -4040847
    rand num is 3,sum is -4040844
    rand num is 5,sum is -4040839
    (省略其他内容)

    从运行结果来看,程序并没有达到我们的预期,这是为什么呢?

    很多读者可能已经知道,问题在于声明sum之后,没有为其赋初始值,在这样的情况下,sum的值是随机的,因此在一开始sum可能是一个很小的负数,导致多次循环出现。很显然,初始化避免使用了变量的“脏值”。而将sum的声明改成如下定义即可:

    int sum = 0

    如果将sum声明为静态变量,情况又会如何呢?

    //test1.c
    #include 
    #include 
    int main(void){
        static int sum;
        int randNum;
        while(10 > sum)
        {
            randNum =  rand() % 10;

            sum += randNum;
            printf("rand num is %d,sum is %d
    "
    ,randNum,sum);
        }
        printf("the final sum is %d
    "
    ,sum);
        return 0;
    }

    编译并运行:

    rand num is 3,sum is 3
    rand num is 6,sum is 9
    rand num is 7,sum is 16
    the final sum is 16

    在这种情况下,程序是能够符合我们预期的结果,这又是为什么呢?原因在于静态变量会被默认初始化。例如,int类型会被初始化为0。那么问题来了:

    • 为什么局部变量未初始化的时候的值是“脏值”?

    • 静态变量和局部变量为什么又不一样呢?

    在解答上面这两个问题之前,我们需要简单了解一下程序的存储空间布局。

    程序的存储空间布局

    C程序主要由以下几部分组成:

    • 正文段。即机器指令部分,为防止意外被修改,设为只读。

    • 初始化数据段。它包含了程序中需要明确赋初值的静态变量。

    • 未初始化数据段。它包含了程序中未赋初值的或初始化为0的静态变量,在程序开始执行之前,内核将此段中的数据初始化为0。

    • 栈。它保存了自动(局部)变量以及函数调用所要的信息。

    • 堆。用于动态内存分配。例如使用malloc函数进行内存分配。

    其中,正文段和数据段的内容是“静态”的,因为在程序被编译出来之后,在整个程序地址就确定了,而堆栈中的内容是”动态”变化的,它随着进行的运行而不断变化着,再加上栈随机化的策略,使得程序每次运行时,栈的地址也是不确定的。

    局部变量和静态变量的初始化有何不同

    有了前面的铺垫,就很好理解两者的差别了。
    未初始化的局部变量位于栈中,它的位置是不确定的,因此其值也是不确定的。当然,在windows下它的值是0xcccccccc,而“烫”字在MBCS字符集中的值为0xcccccccc,你说巧不巧?

    7de517bfb2efd001aa0e91556b2adfdb.png

    而静态变量就不一样的,它的地址是确定的,并且存放在了数据段,而程序在运行之前,未初始化数据段的内容可以很方便地统一被初始化为0。这也就解释了前面的两个示例程序的结果为什么会不一样。我们加上一些打印,来看一看是否真的如此?

    //test2.c
    #include 
    #include 
    int main(void){
        static int sum;
        int randNum;
        while(10 > sum)
        {
            randNum =  rand() % 10;

            sum += randNum;
            printf("rand num is %d,sum is %d
    "
    ,randNum,sum);
        }
        printf("the final sum is %d
    "
    ,sum);
        printf("sum addr %p,randNum addr %p
    "
    ,&sum,&randNum);
        return 0;
    }

    编译并运行:

    gcc -o test2 test2.c

    运行结果1:

    rand num is 3,sum is 3
    rand num is 6,sum is 9
    rand num is 7,sum is 16
    the final sum is 16
    sum addr 0x60104c,randNum addr 0x7ffd0ea8cf54

    运行结果2:

    rand num is 3,sum is 3
    rand num is 6,sum is 9
    rand num is 7,sum is 16
    the final sum is 16
    sum addr 0x60104c,randNum addr 0x7ffff5e3ddb4

    在这里,sum是静态局部变量,而randNun是局部变量(自动变量),因此可以发现,sum的地址值总是不变的,而randNum的值却不断变化着。我们也可以通过nm命令查看sum的地址:

    nm test2 |grep sum
    000000000060104c b sum.2805

    总结

    我们来总结一下本文的主要内容:

    • 如果变量是静态的,它会被初始化为0;如果变量是自动的,它不会被初始化。

    • 静态的变量包括全局变量、静态全局变量、静态局部变量。

    • 使用局部变量之前对其进行初始化,避免使用“脏值”。

    • 从可读性考虑,静态变量也建议显示初始化。

    • 初始化为0的静态变量仍然存在未初始化数据段中(BSS段)。

    送几句熟悉的话给大家:

    手持两把锟斤拷,
    口中疾呼烫烫烫。
    脚踏千朵屯屯屯,
    笑看万物锘锘锘。

    思考

    test1.c的代码运行结果每次都一样吗?为什么?该如何修改才能使得每次的运行结果不一样?

    栈随机化的作用是什么?


    ●编号510,输入编号直达本文

    ●输入m获取文章

    C语言与C++编程

    fc89f88bc348f0ee44ff55909d44d5c3.png

    分享C/C++技术文章

    展开全文
  • 为了理解为什么,我们先来了一下方法是如何被执行的,然后再分析局部变量的安全性,最后再介绍利用局部变量不会共享的特点而产生的解决并发问题的一些技术。方法是如何被执行的inta = 7;int[] b = fibonacci(a);int...

    f3df88dd21cbee12b66fbbc20b297a7c.png

    前言

    方法中的变量(即局部变量)是不存在数据竞争(Data Race)的,也是线程安全的。为了理解为什么,我们先来了一下方法是如何被执行的,然后再分析局部变量的安全性,最后再介绍利用局部变量不会共享的特点而产生的解决并发问题的一些技术。

    方法是如何被执行的

    int a = 7
    int[] b = fibonacci(a);
    int[] c = b;

    以上代码转换成CPU指令执行,方法的调用过程示意图如下:(图来自参考[1])

    7e00a4ac07e5dcb90b0303a22b041247.png

    当调用fibonacci(a)时,CPU要先找到方法fibonacci()的地址(在CPU堆栈寄存器中),然后跳转到这个地址去执行代码(蓝色线),最后CPU执行完方法,再返回原来调用方法的下一条语句(红色线)。

    CPU找调用方法的参数和返回地址,是通过堆栈寄存器。CPU支持一种线性结构,因为与方法调用有关,所以也称为调用栈

    再举个例子,有三个方法A、B、C。方法A中调用方法B,方法B中调用方法C。那么将会构建出如下调用栈。每个方法在调用栈里都有自己的独立空间,称为栈帧。每个栈帧都有对应方法需要的参数和返回地址。当调用新方法时,会创建新的栈帧,并压入调用栈;当方法返回时,对应的栈帧就会被自动弹出。即,栈帧和方法同生共死。

    62da61583ebc7992fdbabc70a2fd2680.png

    三个方法生成的调用栈如上图所示。

    不同的编程语言虽定义方法虽各有所异,但是它们执行方法的原理却是一致的:都是依靠栈结构解决。Java语言虽然是靠虚拟机解释执行,但是方法的调用也是利用栈结构解决的。

    局部变量的存放位置

    局部变量是定义在方法内,作用域也是在方法内部。当方法运行结束后,局部变量也就失效了。那么我们可以得出,局部变量的存放位置应该在调用栈中。事实上,局部变量就是存放到调用栈中的

    65b02269c9319a010342e11e623d4ed4.png

    调用栈与线程

    两个线程可以同时用不同的参数调用相同的方法,那么调用栈和线程之间是什么关系呢?答案就是:每个线程都有自己独立的调用栈

    6230f330fdb26f63c66adec20df4fbb7.png

    所以,Java方法里面的局部变量是不存在并发问题的。每个线程都有自己独立的调用栈,局部变量保存在各自的调用栈中,不会被共享,自然也就没有并发问题。

    利用不共享解决并发问题的技术: 线程封闭

    当多线程访问没有同步的可变共享变量时就会出现并发问题,而解决方案之一便是使变量不共享。变量不会和其他变量共享,也就不会存在并发问题。仅在单线程里访问数据,不需要同步,我们称之为线程封闭。当某个对象封闭在一个线程中时,这种用法将自动实现线程安全性,即使被封闭的对象本身不是线程安全的。

    采用线程封闭技术的案例非常多。例如一种常见的应用便为JDBC的Connection对象。从数据库连接池中获取一个Connection对象,在JDBC规范中并没有要求这个Connection一定是线程安全的。数据库连接池通过线程封闭技术,保证一个Connection对象一旦被一个线程获取之后,在这个Connection对象返回之前,连接池不会将它分配给其他线程,从而保证了Connection对象不会有并发问题。

    线程封闭技术的一个具体实现是我们上面提到的局部变量的使用(栈封闭),还有一种需要提一下,即ThreadLocal类。

    ThreadLoacl类

    维持线程封闭性一种更规范方法是使用ThreadLocal,这个类能使线程中的某个值与保存值的对象相关联起来。ThreadLocal提供了get()和set()等访问接口,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get()总是返回由当前执行线程在调用set()时设置的最新值。

    ThreadLocal对象通常用于防止对可变的单实例变量(Singleton)或全局变量进行共享


    例如,在单线程应用程序中可能会维持一个全局的数据库连接,并在线程启动时初始化这个连接对象,从而避免在调用每个方法时都要传递一个Connection对象。由于JDBC的连接对象不一定线程安全的,因此,当多线程应用程序在没有协同的情况下使用全局变量时,就不是线程安全的。通过将JDBC的连接保存到ThreadLocal对象中,每个线程都会拥有属于自己的连接。

    如以下代码所示,利用ThreadLocal来维持线程的封闭性:(代码来自参考[2])

    public class ConnectionDispenser {
        static String DB_URL = "jdbc:mysql://localhost/mydatabase";

        private ThreadLocal connectionHolder
            = new ThreadLocal() {public Connection initialValue() {try {return DriverManager.getConnection(DB_URL);
                } catch (SQLException e) {throw new RuntimeException("Unable to acquire Connection, e");
                }
            };
        };public Connection getConnection() {return connectionHolder.get();
        }
    }

    当某个频繁执行的操作需要一个临时对象,例如一个缓冲区,而同时又希望避免在每次执行时都重新分配该临时对象,就可以使用这项技术。例如,在Java 5.0之前,Integer.toString()方法使用ThreadLocal对象来保存一个12字节大小的缓冲区,用于对结果进行格式化,而不是使用共享的静态缓冲区(需要使用加锁机制)或者每次调用时都分配一个新的缓冲区。

    小结

    知道方法是如何调用的也就明白了局部变量为什么是线程安全的。方法调用会产生栈帧,局部变量会放在栈帧的工作内存中,线程之间不共享,故不存在线程安全问题。后面我们介绍了基于不共享解决并发问题的线程封闭技术,除了不共享这种思想可以解决并发问题,还有两种:使用不可变变量和正确使用同步机制。

    原文链接:cnblogs.com/myworld7/p/12264504.html

    d83e0e12336bcb108df604dbcf92a15d.png

    展开全文
  • 2、鼠标右击“计算机”,依次左击“管理”、“磁盘管理”,显示“未初始化”。千万不要初始化!!此时千万不要初始化硬盘,会导致数据丢失。解决思路如下:使用diskgenius搜索分区找回数据,并指派新的驱动器号...

    9260d80f467c69118438451e06b253b9.png

    记录一下。移动硬盘正常使用,未摔、未压,WIN10系统,X220。

    现象:

    1、移动硬盘USB接口插上电脑后,电脑有连接声,硬盘也在运转,但电脑中不显示;

    2、鼠标右击“计算机”,依次左击“管理”、“磁盘管理”,显示“未初始化”。

    2bcdbc78243dc97e2c25e4c62cc1e892.png
    千万不要初始化!!

    此时千万不要初始化硬盘,会导致数据丢失。


    解决思路如下:使用diskgenius搜索分区找回数据,并指派新的驱动器号(盘符)。

    1、下载diskgenius软件安装;

    2、连接移动硬盘;

    3、打开diskgenius,选择移动硬盘,点击“工具”,“搜索已丢失分区(重建分区表)”,找到了丢失的移动硬盘分区;

    5392cd4813bd9014bab2dba542d3df78.png
    找到数据,赶紧点保留

    4、从找到的分区中,把数据复制出来(数据重要,先复制保全再进行下一步);

    d61fb7c140a0b45de9383f9baa90ba9f.png
    把文件复制出来

    5、左侧选择移动硬盘,点击“分区”、“指派新的驱动器号(盘符)”,按提示操作即可。

    完成。

    给DiskGenius软件点赞,解决了大麻烦,收入我的软件库中。

    展开全文
  • 点胶阀是在点胶作业中必不可少的配件之一,在点胶过程中点胶阀遇到问题该怎么解决呢,今天阿莱思斯给大家进行分析。1.点胶阀无法停胶问题:a.点胶阀中转杆或密封装置磨损。b.点胶阀的供给气压无法打开2.点胶阀针头...
  • 现在已经在全国进行使用了,不过有部分用户反映里面实名认证不了,不知道怎么解决的话可以看看下面的教程。【无法认证原因】可能曾经使用过别人的认证信息实名认证过,即使注销账户也不会注销实名信息,可以换个号码...
  • 下面就给大家分享笔记本检测到电池的原因及其解决方法。方法1:可能是笔记本经过大的波动之后,电池松动引起,我们可以将电池取下,然后正确安装即可。方法2:如果排除电池本身的问题话,也可能是主板与电池正负极...
  • 使用TensorFlow的时候定义了变量之后还需要初始化之后才能使用,不然会报错:Attempting to use uninitialized value,下面介绍TensorFlow中常用的几种初始化操作1、tf.global_variable_initializer官方介绍地址:tf...
  • 密集型母线槽使用过程中进水了怎么办和解决方法。在使用母线槽过程中,定期要做好维护检查工作,保证能够安全传输电流的输送。在使用密集型母线槽过程中,经常会遇到设备进水了,就会影响到了母线槽的使用,针对不同...
  • 怎么解决摇摇杯变臭 其实最简单有效的方法就是在使用过摇摇杯后将杯子冲洗干净,只有你认真去研究过,你才会发现,很多蛋白粉的残留会夹杂在摇摇杯内的螺纹附近,那么时间长了你也就知道自己应该着重冲洗在什么地方...
  • 在涂装过程中,涂料经搅拌、泵料输送时,混入了空气,一时不易消散,施工后,在涂膜干燥前又没有析...消泡剂可以解决所有泡沫问题吗?水性漆的泡沫来自两个方面 1.水性漆配方中使用的表面活性剂具有起泡性,当涂布时...
  • 在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数结束时这些单元被自动释放,栈内存分配运算内置于处理器指令集中,效率较高,但容量有限;从堆上分配。程序运用malloc或new申请任意多少的内存,...
  • 每年一到冬天,总会有这么一个问题在货车司机中形成很大的争议:该不该用淋水器?有些卡友赞同:不用淋水器长下坡...如何解决刹车失灵的问题?壹有足够的安全意识;提前规划好路线,遇到第一次跑的路线,提前了解一...
  • 微信公众号:二进制人生专注于嵌入式...1、返回局部变量的地址,或者返回指向局部变量的指针int*stackref(){intval;return&val;}2、引用已经被释放了的堆内存(野指针)int*heapref(intn,intm){inti;int*x,*y;...
  • C语言中内存的管理与使用—堆与栈内存管理是计算机学习编程的一个重要知识,也是令大多数程序员比较头疼的一个知识。...1、堆与栈的区别栈:由系统自动分配的释放,用来存放函数的参数、局部变量的值。...
  • 自动赋值为零仅适用于成员,而不适用于局部变量....例如,此代码尝试使用未初始化局部变量:public class Program{public static void main(String[] args){int numOfGuesses; // local variableSystem.out...
  • c++错误c4700求解决

    千次阅读 2020-02-20 20:33:09
    #include “pch.h” #include “iostream” using namespace std; int main() { int a, b, c; c = a + b;...c++小白,这程序写出来提示错误c4700,使用了未初始化局部变量a,b,求问各位大神怎么改 ...
  • 也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中...
  •  1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零?  1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";}  1.33 下面的...
  • 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 1.33 下面的初始化有...
  • 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 1.33 下面的初始化有...
  • 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 47 1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 47 *1.33 下面的...
  • 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 47 1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 47 *1.33 下面的...
  • 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零?  1.32 下面的代码为什么不能编译?intf(){chara[]="Hello,world!";}  *1.33 下面的初始...
  • 初始化 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 1.32 下面的代码为什么不能编译?intf(){chara[]="Hello,world!";} *1.33 下面...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 1.32 下面的代码为什么不能编译?intf(){chara[]="Hello,world!";} *1.33 下面的初始化...
  • 1.31 对于没有显式初始化变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 18  1.32 下面的代码为什么不能编译? intf(){char a[]=Hello, world!;} 18 *1.33 下面...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

局部变量未初始化怎么解决