民间
我试图了解下面的代码中是否有任何东西会导致它在64位平台上失败。我主要担心的是是否发生了一些不适合64位的类型转换。不要过分关注分配给变量的实际数字,因为我为这个例子编写了它们。我主要担心的是long and int and size_t
与您可能看到的任何其他问题之间发生的类型转换问题。
#define NL_AREA 40
#define NS_AREA 38
#define NB_EXTRA (1536 - NS_AREA * NL_AREA)
main()
{
long int bufsize;
int obssize, nelm, nbuf;
int ncol, ndet = 10;
void *result;
obssize = xxx; /* some size */
bufsize = (long)obssize * (NL_AREA * NS_AREA + NB_EXTRA);
ncol = 50;
nbuf = ncol * ndet;
nelm = 1;
result = Buf_Init(bufsize, nelm, nbuf);
}
void *
Buf_Init( size_t elm_size,
int nelm_buf,
long nbuf )
{
long buf_size;
void *p;
buf_size = ((long) elm_size) * nelm_buf;
if ((p = (void *)malloc(buf_size)) == NULL)
return NULL;
else
return p;
}
答案 0 :(得分:1)
我可以对类型转换发表评论,但是......为什么要考虑代码中的意外类型转换,以便完全避免它们?如果可移植性很重要,则不要使用默认的原始数据类型。请改用stdint.h。
int
交换int32_t
。long
交换int32_t
。uint32_t
以防万一。很可能它没有。突然,代码变得100%便携了。
其他评论:
(void *)malloc(buf_size)
?从void*
投射到void*
没有任何意义。 int
。 15年前,隐式int已从C语言中删除。