给定
struct node
{
int a;
struct node * next;
};
为了malloc一个新的结构,
struct node *p = malloc(sizeof(*p));
比更安全
struct node *p = malloc(sizeof(struct node));
为什么?我以为他们是一样的。
它更安全,因为您不必两次提到类型名称,也不必为"取消引用的";类型的版本。例如,你不必";数数星星";在中
int *****p = malloc(100 * sizeof *p);
将其与中基于类型的sizeof
进行比较
int *****p = malloc(100 * sizeof(int ****));
您必须确保在sizeof
下使用了正确的*
编号。
为了切换到另一种类型,您只需要更改一个位置(p
的声明),而不需要更改两个位置。有投malloc
结果习惯的人,要换三个地方。
更普遍地说,坚持以下准则是很有意义的:类型名属于声明,而不属于其他任何地方。实际语句应该是独立于类型的。他们应该尽可能避免提及任何类型名称或使用任何其他类型特定的功能。
后者的意思是:避免不必要的强制转换。避免不必要的特定于类型的常量语法(如0.0
或0L
,其中普通的0
就足够了)。避免在sizeof
下提及类型名称。等等。
因为如果在稍后的某个时间点使p
指向另一种结构类型,那么使用malloc
的内存分配语句就不必更改,它仍然为新的类型分配足够的内存。它确保:
- 您不必每次更改为其分配内存的类型时都修改内存分配语句
- 您的代码更健壮,不太容易出现手动错误
一般来说,不依赖具体类型总是一种很好的做法,第一种形式就是这样做的,它不会对类型进行硬编码。
这很方便,因为您可以转换以下内容:
struct node *p= malloc(sizeof(*p));
进入:
#define MALLOC(ptr) (ptr) = malloc(sizeof(*(ptr) ))
struct node *p;
MALLOC(p);
或者,对于阵列:
#define MALLOC_ARR(ptr, arrsize)
(ptr) = malloc(sizeof(*(ptr) ) * arrsize)
struct node *p;
MALLOC_ARR(p, 20);
为什么这样安全?因为使用这些宏的用户不太可能犯AndreyT概述的错误,就像DIM()
获取静态数组大小的情况一样。
#define DIM(arr) ((sizeof(arr))/(sizeof(arr[0])))
这也更安全,因为用户不需要在几个地方使静态数组大小一致。在一个地方设置数组大小,然后只需使用DIM()
即可!编译器会帮你处理它。