避免分配大小为零的内存空间
当申请分配的内存空间大小为 0 时,malloc、calloc、realloc 等函数的行为是由实现定义的。
示例:
void foo(size_t n) {int* p = (int*)malloc(n * sizeof(int));if (p == NULL)log("Required too much memory"); // ‘n’ may also be zeroelse....
}
当例中 n 为 0 时,malloc 可能会分配元素个数为 0 的数组,也可能会返回空指针。
又如:
char* bar(size_t n) {char* p = (char*)malloc(n * sizeof(char)); // ‘n’ may be zeroif (p != NULL) {p[0] = '\0'; // May overflow}return p;
}
注意,如果 malloc 的返回值不为空,并不能保证其分配的数组大小是合理的,也可能为 0,如果不加判断就数组进行操作,会导致缓冲区溢出等问题。
这种情况下 C++ 语言的 new 运算符会分配元素个数为 0 的数组,但这种数组往往没有实际价值,而且要注意,在 C 和 C++ 语言中元素个数为 0 的数组均需要被释放。
又如:
int* p = (int*)malloc(n * sizeof(int));
....
realloc(p, 0); // Non-compliant, use free(p) instead
C90 规定当 realloc 函数的长度参数为 0 时会释放内存,与 free(p) 相同,但在后续标准中废弃了这一特性,不应继续使用。
参考资料:https://saferules.github.io/#resource