C复习-查缺补漏-更新中

Q
编写一条scanf语句,读取两个整数,保存至quantity和price,再读取一个字符串,保存至字符数组department中

scanf("%d %d %s", &quantity, &price, department);

Q
while( gets( input ) != NULL ) {}这句代码可能出现什么问题?
如果输入行很长,input数组会溢出。使用fgets并提供数组长度是更好的选择。

Q
编写程序,从标准输入读取再打印到标准输出中,并在每行前面加上行号。需要保证输入行的长度没有限制。

因为不限制行长度,所以使用getchar,另外判断行尾。

int main() {
	int ch;
	int line = 0; // 行号
	int at_beginning = 1; // 表示是否在开头
	while ((ch = getchar()) != EOF) {
		// 先打印行号
		if (at_beginning == 1) {
			printf("%d ", line);
			line += 1;
			at_beginning = 0;
		}
		// 打印字符
		putchar(ch);
		if (ch == '\n')
			at_beginning = 1;
	}
	return 0;
}

Q
假如一个程序需要运行在两台机器上,两台的缺省int长度分别是16和32位,长整型缺省是32和64位。程序使用的某些变量值足够存到int中,某些需要long,为了减少移植时的修改,应该怎么写?

创建一个int_size.h的文件(编写的时候指定位数),然后使用#define指令

32位机器的可以这样写

typedef signed char int8;
typedef short int int16;
typedef int int32;
typedef int defint8;
typedef int defint16;
typedef int defint32;

16位机器可以这样写

typedef signed char int8;
typedef short int int16;
typedef int int32;
typedef int defint8;
typedef int defint16;
typedef int defint32;

Q
如果按%s输出一个enum变量,会打印出什么?

编译器可能会报错,输出未知。应该使用%d输出。

Q
假定一个函数包含了一个自动变量,这个函数在同一行被调用了两次,那么函数第二次调用开始时该自动变量的值和第一次调用即将结束时的值是相同的吗?

可能不相同,也可能相同。在某些架构的机器中,一个硬件中断将把机器的状态信息压到堆栈伤,它们将破坏这些变量。

自动变量auto,只有定义时才创建,当定义它们的函数返回时,系统回收变量所占的存储空间。一般情况下,不作专门说明的局部变量都是自动变量(也可以用auto说明)。举例:块语句中的变量、函数的形参

Q

int func() {
	static int counter = 1;
	return ++counter;
}

int answer = func() - func() * func();

问answer的值是多少?

-和*的计算顺序没问题,但是func()的调用顺序是由编译器决定的,所以answer的值是不一定的。可能是-10 , -5, -2

Q
下面的表达式有何不同?

memchr( buffer, 0, SIZE ) - buffer
strlen( buffer )

主要是第一句。这句也是计算字符串长度的,但是结果的类型是ptrdiff_t,但strlen的结果是size_t。而且如果buffer的数据不是以NUL结尾的话,memchr会返回一个NULL指针,那么减buffer是一个无意义的值;但strlen会在buffer后继续查找,直到找到一个NUL字节

Q
有些C编译器提供了一个称为alloca的函数,它与malloc的区别在于它再堆栈上分配内存。这种类型的分配有什么优点和缺点?

优点:当分配内存的函数返回时,这块内存会自动释放,这是由堆栈的工作方式决定的,可以保证不会出现内存泄漏。缺点:由于函数返回时,被分配的内存将消失,所以它不能用于存储那些需要回传给调用程序的数据。

你可能感兴趣的:(C和指针,c语言,开发语言)