C 程序员传统上喜欢知道很多(可能比他们需要知道的还要多) 关于机器实现的细节。
空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。
有两条简单规则你必须遵循:
1、当你在源码中需要空指针常数时, 用&ldqUo;0&rdqUo; 或&ldqUo;NULL&rdqUo;。
2、如果在函数调用中&ldqUo;0...
问题:
考虑到有关空指针的所有这些困惑,
难道把要求它们内部表达都必须为0 不是更简单吗?如果没有其它的原因, 这样做会是没脑筋的。
因为它会不必要地限制某些实现, 阻止它们...
真有机器用非零空指针?或者不同类型用不同的表达?
至少PL/I, Prime 50 系列用段07777, 偏移0 作为空指针。
后来的型号使用段0, 偏移0 作为C 的空指针,...
在C 语言中对数组和指针的困惑多数都来自这句话。
说数组和指针&ldqUo;等价&rdqUo;不表示它们相同, 甚至也不能互换。
它的意思是说数组和指针的算法定义可以用指针方便...
这是一种便利。
由于数组会马上蜕变为指针, 数组事实上从来没有传入过函数。
允许指针参数声明为数组只不过是为让它看起来好像传入了数组, 因为该参数可能在函数内当作数组使用。
...
通常, 你不需要。
当人们随便提到数组指针的时候, 他们通常想的是指向它的第一个元素的指针。
考虑使用指向数组某个元素的指针, 而不是数组的指针。
类型T 的数组蜕变成类型T...
传统的解决方案是分配一个指针数组,
然后把每个指针初始化为动态分配的&ldqUo;列&rdqUo;。
以下为一个二维的例子:
#inclUde <stdlib.h>...
现象:当我向一个接受指针的指针的函数传入二维数组的时候, 编译器报错了。
数组蜕化为指针的规则(参见问题6.3) 不能递归应用。
数组的数组(即C 语言中的二维数组) 蜕化为数...
这并非易事。
一种办法是传入指向[0][0] 成员的的指针和两个维数, 然后&ldqUo;手 工&rdqUo; 模拟数组下标。
void f2(int *aryp, int n...
没有完美的方法。
假设有如下声明
int array[NROWS][NCOLUMNS];
int **array1; /* 不齐的*/
int **array2; /* 连...
问题:为什么这段代码不行?
char *answer;
printf("Type something:\n");
gets(answer);
printf("YoU typ...
一般地说, 使用指针的时候, 你必须总是考虑内存分配, 除非明确知道编译器替你做了此事。
如果一个库函数的文档没有明确提到内存分配, 那么通常需要调用者来考虑。Unix 型的手册...
我有个函数, 本该返回一个字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。
确保指向的内存已经正确分配了。
例如, 确保你没有做下面这样的事情:
char *itoa...
问题:
我的程序总是崩溃, 显然在malloc 内部的某个地方。
但是我看不出哪里有问题。
是malloc() 有bUg 吗?很不幸, malloc 的内部数据结构很容易被破...
是的。
有些早期的malloc() 文档提到释放的内存中的内容会&ldqUo;保留&rdqUo;,
但这个欠考虑的保证并不普遍而且也不是C 标准要求的。
几乎没有那个程序员会...
在调用alloca() 的函数返回的时候, 它分配的内存会自动释放。
也就是说, 用alloca 分配的内存在某种程度上局部于函数的&ldqUo;堆栈帧&rdqUo...