如何摆脱以下符号转换警告?

How do I get rid of the following sign-conversion warning?

每当调用函数 initSetArray() 时,我都会收到以下警告:

error: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Werror=sign-conversion]
  setarray = (set*)malloc(sizeof(set) * number_of_sets);   

函数 initSetArray 只是初始化 setarray。

void initSetArray(set *setarray, int number_of_sets, int number_of_blocks)
{
    setarray = (set*)malloc(sizeof(set) * number_of_sets);
}

我已经定义了两个结构,用于上面定义的辅助函数:

typedef struct{
    uint64_t tag;   // For identifying the block
    uint8_t valid;  // Valid bit for the block
    uint8_t dirty;  // Dirty bit for the block
} block;

typedef struct{
    uint64_t index; // For identifying the set
    block* way;
} set;

我无法准确找出哪个变量属于 "long unsigned int" 类型。我该怎么做才能解决这个问题?

在此声明中

setarray = (set*)malloc(sizeof(set) * number_of_sets);

变量number_of_sets是一个整数(int),因为它用在表达式中与sizeof(size_t),所以值被转换为匹配。

size_t 通常是 unsigned long。如果你不喜欢这个警告,这会解决它:

setarray = (set*)malloc(sizeof(set) * (size_t) number_of_sets);

malloc 函数接受一个 size_t 参数,size_t 为您的构建定义为 unsigned long int(通常如此)。在你的通话中:

setarray = (set*)malloc(sizeof(set) * number_of_sets);

您正在将这样的 size_t 值(sizeof 运算符给出 size_t)乘以(有符号的)int 变量 - 因此出现警告。

为了避免这种情况,可以 显式地将 number_of_sets 转换为 size_t,如下所示:

setarray = (set*)malloc(sizeof(set) * (size_t)number_of_sets);

或者,更好的是,将该参数的类型更改为 size_t:

void initSetArray(set *setarray, size_t number_of_sets, size_t number_of_blocks)
{
    setarray = (set*)malloc(sizeof(set) * number_of_sets);
}

通常,当使用表示对象 'count' 或 'size' 的变量时,unsigned int 是可取的(除非你可以 真的 计数或尺寸为负数)。

警告是在非常严格的警告设置下产生的,因为值number_of_setsint隐式转换为无符号类型unsigned long int,这可能有一个违反直觉的值number_of_sets.

的负值

要消除此警告,您可以:

  • 更改 initSetArray 的原型以修复参数的类型:number_of_setsnumer_of_blocks 可能应该是 size_t 类型的无符号值无论如何:

    void initSetArray(set *setarray, size_t number_of_sets, size_t number_of_blocks)
    
  • 或者,您可以使用强制转换运算符添加显式转换:

    void initSetArray(set *setarray, int number_of_sets, int number_of_blocks) {
        setarray = (set*)malloc(sizeof(set) * (size_t)number_of_sets);
    }
    

但是请注意,设置参数 setarray 的值对用作 initSetArray 参数的调用者变量没有影响。您应该 return 指针或将指针指向指针参数。