495 41-50

作者: 帽子和五朵玫瑰 | 来源:发表于2018-06-29 09:45 被阅读0次

    495-31-40

    31.对于没有显式初始化的变量的初始值可以做怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零?

    答:具有静态生存期的末初始化变量(包括数组和结构)--即在函数外声明的变量和静态存储类型的变量)可以确保初始值为零,就像程序员键入了“=0”一样,因此,这些变量如果是指针就会被初始化为正确类型的空指针。如果是浮点数,则会被初始化为0.0;

    具有自动生存期的变量,(即非静态存储类型的局部变量)如果没有显式的初始化,则包含的是垃圾内容,对垃圾内容不能做任何有用的假定。

    这些规则也适用于数组和结构。对于初始化来说,数组和结构都被认为是“变量”

    用malloc和realloc动态分配的内存也可能包含垃圾数据,因此必须有调用者正确地初始化。用calloc获得的内存全为0.但这对指针和浮点值不一定有用

    32.下面的代码为什么不能编译

    int f() {
        char a[] = "hello, world";
    }
    

    答:可能比使用的是ANSI前的编译器,还不支持“自动聚集”(automatic aggregate,即非静态局部数组,结构和联合)的初始化。

    有四种办法可以完成这个任务

    (1)如果数组不会被写入,或者后续的调用中不需要更新其中的内容,可以把它声明为static

    (2)如果数组不会被写入,也可以用指针代替它:

    f() {
        char  *a = "hello world";
    }
    

    初始化局部char * 变量,使之指向字符串字面量总是可以的

    (3)如果上边的条件都不满足,你就得在函数调用的时候用strcpy手工初始化

    f() {
        char a[14];
        strcpy(a, "hello, world");
    }
    

    33.下面的初始化有什么问题?编译器提示“invalid initializers”

    char *p = malloc(10);
    

    答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量)的初始化中。

    34.以下的初始化有什么区别?

    char a[] = "string literal";
    char *p = "string literal";
    

    当我想p[i]赋值的时候,崩溃了

    答:字符串字面量--C语言源程序中用双引号包含的字符串的正式名称--有两种稍有区别的用法:

    (1)用作数组初始值(如同在char a[]的声明中),它指明该数组中字符的初始值;

    (2)其他情况下,它会转化为一个无名的静态字符数组,可能会存储在只读内存中吗,这就导致它不能被修改,在表达式环境中,数组通常被立即转化为一个指针,因此第二个声明把p初始化成指向无名数组的第一个元素。

    36.我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢?

    答:用下面这样的代码:

    extern int func();
    int (*fp)() = func;
    

    当一个函数名出现在这样的表达式中时,它就会“退化”成一个指针(即隐式地取出了它的地址),这有点类似数组名的行为

    通常函数的显式声明需要事先知道(也许在一个头文件中),因此此处并没有隐式的外部函数声明
    ·12

    相关文章

      网友评论

          本文标题:495 41-50

          本文链接:https://www.haomeiwen.com/subject/fxboyftx.html