关键词不能为空

当前您在: 主页 > 英语 >

C语言常见问题集合

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:47
tags:

-

2021年3月3日发(作者:forestry)


C


语言常见问题集合



1.


前言




2.


声明和初始化




2.1


我如何决定使用那种整数类型?




2.2 64


位机上的



64


位类型是什么样的?




2.3


怎样定义和声明全局变量和函数最好?




2.4 extern


在函数声明中是什么意思?




2.5


关键字



auto


到底有什么用途?




2.6


我似乎不能成功定义一个链表。我试过




typedef


struct { char


*item;


NODEPTR


next;


}


*NODEPTR;


但是编译器报了错误信息。难道在


C


语 言中一个结构不能包含指向自己的指


针吗?




2.7


怎样建立和理解非常复杂的声明?例如定义一个包含



N


个指向返回指向字符的指针的


函数 的指针的数组?




2.8


函数只定义了一次


,


调用了一次


,


但编译器提示非法重定义了。




2.9 main()


的正确定义是什么?




void main()


正确吗?




2.10


对于没有初始化的变量的 初始值可以作怎样的假定?如果一个全局变量初始值为



``< /p>




它可否作为空指针或浮点零?




2.11


代码



int f() { char a[] =


不能编译。




2.12


这样的初始化有什么问题?


char *p = malloc(10);



编译器提示



``

非法初始式



云云。




2.13


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


char


a[]


=



literal


char


*p


=



l iteral


当我向



p[i]


赋值的时候


,


我的程序崩溃了。




2.14


我总算弄清除函数指针的声明方法了


,


但怎样才能初始化呢?






3.


结构、联合和枚举




3.1


声明



struct x1 { ...};




typedef struct { ...} x2;


有什么不同?




3.2


为什么



struct x { ...}; x thestruct;


不对?




3.3


一个结构可以包含指向自己的指针吗?




3.4




C


语言中实现抽象数据类型什么方法最好


?



3.5




C


中是否有模拟继承等面向对象程序设计特性的好方法?




3.6


我遇到这样声明结构的代码


: struct name { int namelen; char namestr[1];};


然后又使用一


些内存分配技巧使



namestr



数组用起来好像有多个元素。这样合法和可移植吗?




3.7


是否有自动比较结构的方法?




3.8


如何向接受结构参数的函数传入常数值?




3.9


怎样从

/


向数据文件读


/


写结构?




3.10


我的编译器在结构中留下了空洞


,


这导致空间浪费而且无法与外部数据文件进行





进制



读写。能否关掉填充


,


或者控制结构域的对齐方式


?



3.11


为什么



sizeof


返回的值大于结构的期望值


,


是不是尾部有填充


?



3.12


如何确定域在结构中的字节偏移?




3.13


怎样在运行时用名字访问结构中的域?




3.14


程序运行正确


,


但退出时却



``core dump''


了,怎么回事?




3.15


可以初始化一个联合吗?




3.16


枚举和一组预处理的



#define


有什么不同?




3.17


有什么容易的显示枚举值符号的方法?






4.


表达式




4.1


为什么这样的代码


:




a[i] = i++;


不能工作?




4.2


使用我的编译器


,

< p>
下面的代码




int


i=7;


printf(


i++


*


i++);


返回



49


? 不管按什么


顺序计算


,


难道不该打印 出


56


吗?




4.3


对于代码




int i = 3; i = i++;


不同编译器给出不同的结果


,


有的为



3,


有的为



4,


哪个是


正确的?




4.4


这是个巧妙的表达式


:




a ^= b ^= a ^= b



它不需要临时变量就可以交换



a




b


的值。




4.5


我可否用括号来强制执行我所需要的计算顺序?




4.6


可是



&&




||


运算符呢?我看到过类似




while((c


=


getchar())


!=


EOF


&&


c


!=


'n')



的代码



……




4.7


我怎样才能理解复杂表达式 ?


``


序列点



是什么?




4.8


那么


,


对于



a[i]


=


i++;


我们不知道



a[]


的哪一个分量会被改写


,




i


的确会增加



1,



吗?




4.9 ++i




i++


有什么区别?




4.10


如果我不使用表达式的值


,


我应该用



++i




i++



来自增一个变量吗?




4.11


为什么如下的代码




int a = 100, b = 100; long int c = a * b;


不能工作?




4.12


我需要根据条件把一个复 杂的表达式赋值给两个变量中的一个。可以用下边这样的代


码吗?




((condition) ? a : b) = complicated_expression;





5.


指针




5.1


我想声明一个指针并为它分配一些空间


,


但却不行。这些代码有什么问题?



char *p; *p


= malloc(10);



5.2 *p++


自增



p


还是



p


所指向的变量?




5.3


我有一个



char


*


型指针正巧指向一些



int


型变量


,


我想跳过它们。为什么如下的代码



((int *)p)++;


不行?




5.4


我有个函数


,


它应该接受并初始化一个指针




void


f(int


*ip)


{


static


int


dummy


=


5;


ip


=


&dummy;}


但是当我如下调用时


: int *ip; f(ip);


调用者的指针却没有任何变化。




5.5


我能否用



void**


指针作为参数


,


使函数按引用接受一般指针?




5.6


我有一个函数



extern int f(int *);


它接受指向




int


型的指针。我怎样用引用方式传入一

< br>个常数?下面这样的调用



f(&5);


似乎不行。




5.7 C



``


按引用传递



吗?




5.8


我看到了用指针调用函数的不同语法形式。到底怎么回事?




5.9


我怎样把一个



int


变量转换为



char *


型?我试了类型转换


,


但是不行。






6.




(null)


指针




6.1


臭名昭著的空指针到底是什么?




6.2


怎样在程序里获得一个空指针?




6.3


用缩写的指针比较



``if(p)


检查空指针是否可靠?如果空指针的内部表达不是



0


会怎


么样?




6.4 NULL


是什么


,


它是怎么定义的?




6.5


在使用非全零作为空指针内部表达的机器上


, NULL


是如何定义的?




6.6


如果



NULL


定义成



#define


NULL


((char


*)0)



难道不就可以向函数传入不加转换的



NULL


了吗?




6.7


如果



NULL




0


作为空指针常数是等价的


,


那我到底该用哪一个呢?




6.8


但是如果



NULL


的值改变了


,


比如在使用非零内部空指针的机器上


,


难道用



NULL


(


而不是



0)


不是更好吗?




6.9


用预定义宏



#define Nullptr(type) (type *)0


帮助创建正确类型的空指针。




6.10


这有点奇怪。


NULL


可以确保是



0,


但空



(null)


指针却不一定?




6.11


为什么有那么多关于空指针的疑惑?为什么这些问题 如此经常地出现?




6.12


我很困惑。我就是不能理解这些空指针一类的东西。




6.13


考虑到有关空指针的所有这些困惑


,


难道把要求它们内部表达都必须为



0


不是更简单


吗?




6.14


说真的


,


真有机器用非零空指针吗


,


或者不同类型用不同的表达?




6.15


运行时的



``


空指针赋值



错误是什么意 思?






7.


数组和指针




7.1


我在一个源文件中定义了



char


a[6],


在另一个中声明了




extern


char


*a


。为什么不







7.2


7.3


7.4


7.5


可是我听说



char a[ ]




char *a


是一样的。




那么


,




C


语言中



``


指针和数组等价



到底是什么意思< /p>






那么为什么作为函数形参的数组和指针申明可以互换呢






如果你不能给它赋值


,


那么数组如何能成为左值呢






7.6


现实地讲


,


数组和指针地区别是什么






7.7


有人跟我讲


,


数组不过是常指针。




7.8


我遇到一些



``


搞笑



的代码


,


包含



5[



这样的



``


表达式





这为什么是合法的



C


表达式呢






7.9


既然数组引用会蜕化为指针


,


如果



arr


是数组


,


那么



arr




&arr



又有什么区别呢






7.10


我如何声明一个数组指针






7.11


我如何在运行期设定数组的大小





我怎样才能避免固定大小的数组






7.12


我如何声明大小和传入的数组一样的局部数组






7.13


我该如何动态分配多维数组






7.14


有个灵巧的窍门


:



如果我这样写




int realarray[10]; int *array = &realarray[-1];



我就可


以把



``array


当作下标从



1


开始的数组。




7.15


当我向一个接受指针的指针的函数传入二维数组的时候


,


编译器报错了。




7.16


我怎样编写接受编译时宽度未知的二维数组的函数






7.17


我怎样在函数参数传递时混用静态和动态多维数组






7.18


当数组是函数的参数时


,


为什么



sizeof


不能正确报告数组的大小








8.


内存分配




8.1


为什么这段代码不行?


char *answer; printf(


ou


typed



8.2


我的



strcat()


不行


.


我试了




char *s1 =



s2);



但是我得到了奇怪的结果。




8.3


但是



strcat


的手册页说它接受两个



char *


型参数。


我怎么知道



(


空间


)


分配的事情呢?




8.4


我刚才试了这样的代码




char *p; strcpy(p,

< br>而它运行正常?怎么回事?为什么它


没有崩溃?




8.5


一个指针变量分配多少内存?




8.6


我有个函数


,


本该返回一个字符串


,


但当它返回调用者的时候


,


返回串却是垃圾信息。




8.7


那么返回字符串或其它集合的争取方法是什么呢?




8.8


为什么在调用



malloc()



,


我得到



``


警告


:


整数赋向指针需要类型转换






8.9


为什么有些代码小心地把



malloc


返回的值转换为分配的指针类型。




8.10


在调用



malloc()


的时候


,


错误



``


不能把



void *


转换为



int *



是什么意思?




8.11


我见到了这样的代码




char


*p


=


malloc(strlen(s)


+


1);


strcpy(p,


s);



难道不应该是



malloc((strlen(s) + 1) * sizeof(char))





8.12


我如何动态分配数组?




8.13


我听说有的操作系统程序使用的时候才真正分配



malloc


申请的内存。这合法吗?




8.14


我用一行这样的代码分配一个巨大的数组


,


用于数字运算


:



double *array = malloc(300


*


300


*


sizeof(


double


));



malloc()


并没有返回



null,


但是程序运行得有些奇怪


,


好像改写


了某些内存


,


或者



malloc()


并没有分配我申请的那么多内存


,


云云。




8.15


我的



PC




8


兆内存。为什么我只能分配



640K


左右的内存?




8.16


我的程序总是崩溃


,


显然在



malloc


内部的某个地方。



但是我看不出哪里有问题。是



malloc()




bug


吗?




8.17


动态分配的内存一旦释放之后你就不能再使用


,


是吧?




8.18


为什么在调用



free()


之后指针没有变空?使用



(


赋值


,


比较


)



释放之后的指针有多么


不安全?




8.19


当我



malloc()


为一个函数的局部指针分配内存时


,


我还需要用




free()


明确的释放


吗?




8.20


我在分配一些结构


,


它们包含指向其 它动态分配的对象的指针。我在释放结构的时候


,


还需要释放每一个下级指针吗?




8.21


我必须在程序退出之前释放分配的所有内存吗?




8.22


我有个程序分配了大量的内存


,


然后又释放了。


但是从操作系统看


,


内存的占用率却并


没有回去。




8.23 free()


怎么知道有多少字节需要释放?




8.24


那么我能否查询



malloc



,


可分配的最大块是多大?




8.25




realloc()


的第一个参数传入空指针合法吗?你为什么要这样做?




8.26 calloc()




malloc()


有什么区别?利用



calloc


的零填充功能安全吗?



free()


可以释放



calloc()


分配的内存吗


,


还是需要一个



cfree()





8.27 alloca()


是什么?为什么不提倡使用它?






9.


字符和字符串




9.1


为什么



strcat(string, '!');


不行?




9.2


我在检查一个字符串是否跟某个值匹配。



为什么这样不行?



char *string; ... if(string ==




9.3


如果我可以写




char


a[]


=



world!



为什么我不能写




char


a[14];


a


=



world!



9.4


我怎么得到对应字符的数字



(


字符集


)



,


或者相反?




9.5








译< /p>






:







sizeof('a')




2







1


(



,





sizeof(char))







10.


布尔表达式和变量




10.1


C


语言中布尔值的候选类 型是什么?为什么它不是一个标准类型?我应该用



#define




enum


定义



true




false


值吗?




10.2


因为在



C


语言中所有的非零值都被看作



``< /p>




是不是把



TRUE



定义为



1


很危


险?如果某个内置的函数或关系操作符


< br>``


返回



不是

< br>


1


的其它值怎么办?




10.3




p


是指针时


, if(p)


是合法的表达式吗?






11. C


预处理器




11.1


这些机巧的预处理宏


:



#define begin {



#define end }



你觉得怎么样?




11.2


怎么写一个一般用途的宏交换两个值?




11.3


书写多语句宏的最好方法是什么?




11.4


我第一次把一个程序分成多个源文件


,


我不知道该把什么放到



.c


文件


,


把什么放




.h


文件。


(``.h


到底是什么意思?


)



11.5


一个头文件可以包含另一头文件吗?




11.6 #include <>




#include


有什么区别?




11.7


完整的头文件搜索规则是怎样的?




11.8


我在文件的第一个声明就遇到奇怪的语法错误


,


但是看上去没什么问题。




11.9


我包含了我使用的库函数的正确头文件


,


可是连接器还是说它没有定义。




11.10


我在编译一个程序


,


看起来我好像缺少需要的一个或多个头文件。谁能发给我一份?




11.11


我怎样构造比较字符串的



#if


预处理表达式?




11.12 sizeof


操作符可以用于



#if


预编译指令中吗?




11.13


我可以在



#include


行里使用



#ifdef


来定义两个不同的东西吗?




11.14




typdef


的类型定义有没有类似



#ifdef


的东西?




11.15


我如何用



#if


表达式来判断机器是高字节在前还是低字节在前?




11.16


我得到了一些代码


,


里边有太多的



#ifdef




我不想使用预处理器把所有的



#include




#ifdef


都扩展开


,


有什么办法只保留一种条件的代码呢?




11.17


如何列出所有的预定义标识符?




11.18


我有些旧代码


,


试图用这样的宏来构造标识符




#define


Paste(a,


b)


a/**/b


但是现在不


行了。




11.19


为什么宏




#define TRACE(n) printf(



报出警告



``


用字符串常量代


替宏



?它似乎应该把




TRACE(count);



扩展为




printf(



11.20


使用



#


操作符时


,


我在字符串常量内使用宏参数有问题。




11.21


我想用预处理做某件事情


,


但却不知道如何下手。




11.22


怎样写参数个数可变的宏?






12. ANSI/ISO


标准



C



12.1


12.2


12.3


12.4


什么是



``ANSI C


标准






我如何得到一份标准的副本?




我在哪里可以找到标准的更新?




很多



ANSI


编译器在遇到以下代码时都会警告类型不匹配。




extern int func(float); int


func(x) float x; { ...



12.5


能否混用旧式的和新型的函数语法?




12.6


为什么声明




extern int f(struct x *p);



报出了一个奇怪的警告信息



``


结构



x


在参数列


表中声明





12.7


我不明白为什么我不能象这样在初始化和数组维度中使用常量


: const int n = 5; int a[n];



12.8


既然不能修改字符串常量


,


为什么不把它们定义为字符常量的数组?




12.9 ``const char *p




``char * const p


有何区别?




12.10


为什么我不能向接受



const char **


的函数传入



char **





12.11


怎样正确声明



main()





12.12


我能否把



main()


定义为



void,


以避免扰人的



``main


无返回值



警告?




12.13




main()


的第三个参数



envp


是怎么回事?




12.14


我觉得把



main()


声明为



void


不会失败


,


因为我调用了



exit()



而不是



return ,


况且


我的操作系统 也忽略了程序的退出


/


返回状态。




12.15


那么到底会出什么问题?真的有什么系统不支持



void main()


吗?




12.16


我一直用的那本书《熟 练傻瓜


C


语言》总是使用



void main()





12.17




main()



, exit(status)


和返回同样的



status


真的等价吗?




12.18


我试图用



ANSI


``


字符串化



预处理操作符



#


向信息中插入符号常量的值


,


但它字


符串化的总是宏的名字而不是它的值。




12.19


警告信息



``warning: macro replacement within a string literal


是什么意思?




12.20


在我用



#ifdef


去掉的代码里出现了奇怪的语法错误。




12.21 #pragma


是什么


,


有什么用?




12.22 ``#pragma once


是什么意思?我在一些头文件中看到了它。




12.23 a[3] =


合法吗?它是什么意思?




12.24


为什么我不能对



void*


指针进行运算?




12.25 memcpy()




memmove()


有什么区别?




12.26 malloc(0)


有什么用?返回一个控指针还是指向



0



字节的指针?




12.27


为什么



ANSI


标准规定了外部标示符的长度和大小写限制?




12.28


我的编译对最简单的测试程序报出了一大堆的语法错误。




12.29


为什么有些



ASNI/ISO


标准库函数未定义?我明明使用的就是



ANSI


编译器。




12.30


谁有把旧的



C


程序转化为



ANSI C


或相反的工具


,


或者自动生成原型的工具?




12.31


为什么声称兼容



ANSI




Frobozz


Magic


C < /p>


编译器不能编译这些代码?我知道这些


代码是


ANSI



,


因为



gcc


可以编译。




12.32


人们好像有些在意实现定义



(implementation-defin- ed)


、未明确




(unspecified)


和无定




(undefined)


行为的区别。它们的区别到底在哪里?




12.33


一个程序的



``

合法



有效





``


符合



到底是什么意思?




12.34


我很吃惊


, ANSI


标准竟然有那么多没有定义的东西。


标准的唯一任务不就是让这 些东


西标准化吗?




12.35


有人说



i


=


i++


的行为是未定义的


,


但是我刚在一个兼容



ANSI



的编译器上测试


,


得到了我希望的结果。



-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:47,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/700047.html

C语言常见问题集合的相关文章