-
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
使用我的编译器
,
下面的代码
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
的编译器上测试
,
得到了我希望的结果。
-
-
-
-
-
-
-
-
-
上一篇:中考英语必考词完整版
下一篇:C++中的各种数据类型和关键字的意思