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)
所以它基本上检查了两件事:
我的问题是:做这些检查是否正确?这被认为是好的做法还是我应该使用别的东西呢?此外,有人可以解释为什么分配受到SIZE_MAX的限制吗?
进行检查是正确的,有人会说这是迂腐的。一些想法
\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\nRun Code Online (Sandbox Code Playgroud)\n\n如果内存分配大小为 0,则返回值 NULL 有效。
\n\n监视尝试的负内存分配请求,因为许多请求是用int(有符号)形成的,即使请求采用size_t(无符号)。
内存分配仅限于SIZE_MAX典型系统中无法分配的内存(size_t)-1或任何新的内存分配。看看C标准的定义,其中RSZIE_MAX与你关心的问题密切相关。
C11dr \xc2\xa7K.3.4 3
\n过大的对象大小通常表明对象\xe2\x80\x99s 大小计算不正确。例如,负数在转换为无符号类型(如 size_t)时显示为非常大的正数。此外,某些实现不支持与 size_t 类型可以表示的最大值一样大的对象。