495 41-50

2018-06-29  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读