如何正确检查传递给malloc()calloc()realloc()的大小及其返回值?

tyr*_*na4 6 c size pointers allocation return-value

如果我已经正确理解,在与sizeof(desired_type)相乘后检查传递给malloc(),calloc()或realloc()的所需空间是否也不超过SIZE_MAX常量也很重要.为了确保没有发生,我开始在我的代码中做这样的事情:

#define MAX_CHAIN (50)


#ifndef SIZE_MAX
#define SIZE_MAX (~(size_t)0)
#endif

int main(int argc, char const *argv[]){

    char **parsed_string;

    if(MAX_CHAIN > SIZE_MAX/sizeof(char*) || 
    (parsed_string=(char**)malloc(MAX_CHAIN * sizeof(char*)))==NULL){
        printf("%s\n", "Error, cannot allocate memory");
        exit(1);
    }

    /*Otherwise pointer is valid and the execution continues*/


}
Run Code Online (Sandbox Code Playgroud)

所以它基本上检查了两件事:

  1. 请求的内存不大于SIZE_MAX
  2. malloc()返回的指针是有效的.

我的问题是:做这些检查是否正确?这被认为是好的做法还是我应该使用别的东西呢?此外,有人可以解释为什么分配受到SIZE_MAX的限制吗?

chu*_*ica 3

进行检查是正确的,有人会说这是迂腐的。一些想法

\n\n
#include <stdint.h>\n...\n// MAX_CHAIN > SIZE_MAX/sizeof(char*)\nMAX_CHAIN > (SIZE_MAX - sizeof(char*) +1)/sizeof(char*)\n// This deals with SIZE_MAX/sizeof(char*) rounding toward 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果内存分配大小为 0,则返回值 NULL 有效。

\n\n

监视尝试的负内存分配请求,因为许多请求是用int(有符号)形成的,即使请求采用size_t(无符号)。

\n\n
\n\n

内存分配仅限于SIZE_MAX典型系统中无法分配的内存(size_t)-1或任何新的内存分配。看看C标准的定义,其中RSZIE_MAX与你关心的问题密切相关。

\n\n

C11dr \xc2\xa7K.3.4 3
\n过大的对象大小通常表明对象\xe2\x80\x99s 大小计算不正确。例如,负数在转换为无符号类型(如 size_t)时显示为非常大的正数。此外,某些实现不支持与 size_t 类型可以表示的最大值一样大的对象。

\n