繁体   English   中英

在malloc期间强制转换size_t以初始化c中的char *数组

[英]Casting size_t during malloc to initialize char* array in c

我正在审查我的一些旧代码和我用来初始化malloc()的方法,因为c字符串似乎可以正常工作但仔细检查后我担心可能的缓冲区溢出。

我目前的风格是获取char的size_t和我想要的值的倍数。 例如:

#include <stdlib.h>
#include <limits.h>

int main(int argc,char **argv)
{
    char *string = malloc(sizeof(char) * PATH_MAX + 1);
    /* do stuff */
    free(string);
    return somevalue;
 }

但是我的旧代码我只是将size_t的值转换为我想要的值而不是使用

    char *string = malloc(sizeof(char) * PATH_MAX + 1);

我用了

    char *string = malloc((size_t)PATH_MAX + 1);

因为我正在分配一个字符数组malloc将取数据类型的值并使用它作为正确的字节大小使前两个语句类似或者我创建了一个意外的缓冲区溢出机会,假定字符串是放入“字符串”小于PATH_MAX的大小。

sizeof(char)很少提供信息。 根据定义,它始终为1且类型为size_t

// Both attempt to allocate the same amount.
char *string1 = malloc(sizeof(char) * PATH_MAX + 1);
char *string2 = malloc((size_t)PATH_MAX + 1);

以下略有不同。 虽然更简单,但根据PATH_MAX的类型,迂腐, PATH_MAX + 1可能会溢出。

char *string3 = malloc(PATH_MAX + 1);

更好的是

char *string4 = malloc(PATH_MAX + 1u);

小心翼翼地说这应该是

char *string5 = malloc(PATH_MAX + (size_t)1); // or like string2 above

或者,使用sizeof_referenced_variable * element_count惯用法并避免类型问题。

string6 = malloc(sizeof *string6 * (PATH_MAX + 1u));

N是公式时,使用sizeof_this * NN * sizeof_this相比具有优势。

int rows, columns;
...
                                 v------v----- size_t multiplication                        
matrix1 = malloc(sizeof *matrix1 * rows * columns);
                      v----------- int multiplication (overflow possible)                  
                      |         v- size_t multiplication                        
matrix2 = malloc(rows * columns * sizeof *matrix2);

当然,如果产品溢出size_t math,代码就是SOL

我目前的风格是获取char的size_t和我想要的值的倍数。

对于所有符合标准的编译器,C标准保证sizeof(char)计算结果为1 ,因此完全不需要乘法。

您的旧表达式和新表达式应转换为相同的代码。

malloc的参数是您要为其分配内存的字节数。 由于sizeof(char)按照C标准是1字节,因此两种方法都将分配相同数量的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM