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



我正在检查一些旧代码,我用来初始化c字符串malloc()的方式似乎有效,但仔细检查后,我担心可能出现缓冲区溢出。

我目前的风格是得到一个字符的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将获取数据类型的值并将其用作适当的字节大小,使前面的两个语句类似,或者我是否创建了一个偶然的缓冲区溢出的机会,假设要放入"string"的字符串小于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 * N比使用N * 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数学,代码是SOL。

我目前的风格是获得一个字符的size_t,并乘以我想要的值。

C标准保证sizeof(char)对所有符合标准的编译器求值为1,因此乘法是完全不必要的。

你的旧表达式和新表达式应该翻译成相同的代码

malloc的参数是您想要分配内存的字节数。由于sizeof(char)在C语言标准中为1字节,因此这两种方法将分配相同的内存量。

相关内容

  • 没有找到相关文章

最新更新