我正在检查一些旧代码,我用来初始化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字节,因此这两种方法将分配相同的内存量。