Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何消除以下符号转换警告?_C_Gcc_Warnings_Unsigned - Fatal编程技术网

C 如何消除以下符号转换警告?

C 如何消除以下符号转换警告?,c,gcc,warnings,unsigned,C,Gcc,Warnings,Unsigned,每当调用函数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(

每当调用函数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);
}
我已经定义了两个结构,用于上面定义的helper函数:

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;
我无法确切地找出哪一个变量的类型是长无符号int。如何解决此问题

在这个声明中

setarray = (set*)malloc(sizeof(set) * number_of_sets);
_集合的变量数_是整数int,因为它在sizeof size_t的表达式中使用,所以该值被转换为匹配

大小\u t通常是无符号长字符。如果您不喜欢该警告,这将修复它:

setarray = (set*)malloc(sizeof(set) * (size_t) number_of_sets);
在这份声明中

setarray = (set*)malloc(sizeof(set) * number_of_sets);
_集合的变量数_是整数int,因为它在sizeof size_t的表达式中使用,所以该值被转换为匹配

大小\u t通常是无符号长字符。如果您不喜欢该警告,这将修复它:

setarray = (set*)malloc(sizeof(set) * (size_t) number_of_sets);
malloc函数接受一个size_t参数,并且size_t通常被定义为无符号long int。在您的通话中:

setarray=set*mallocsizeofset*集合数; 将sizeof运算符给出的size\u t值乘以带符号的int变量,即警告

为了避免这种情况,可以将集合的数量\u显式强制转换为大小\u t,如下所示:

setarray=set*mallocsizeofset*size\t集合的数量; 或者,最好将该参数的类型更改为大小:

void initSetArrayset*setarray,集合的大小和数量,块的大小和数量 { setarray=set*mallocsizeofset*集合数; } 通常,当使用表示对象的“计数”或“大小”的变量时,除非您的计数或大小确实为负数,否则最好使用无符号int。

malloc函数采用size\u t参数,并且size\u t通常被定义为无符号长int。在您的通话中:

setarray=set*mallocsizeofset*集合数; 将sizeof运算符给出的size\u t值乘以带符号的int变量,即警告

为了避免这种情况,可以将集合的数量\u显式强制转换为大小\u t,如下所示:

setarray=set*mallocsizeofset*size\t集合的数量; 或者,最好将该参数的类型更改为大小:

void initSetArrayset*setarray,集合的大小和数量,块的大小和数量 { setarray=set*mallocsizeofset*集合数; }
通常,当使用表示对象的“计数”或“大小”的变量时,最好使用无符号int,除非您的计数或大小为负数。

警告是在非常严格的警告设置下产生的,因为集合的数值\u会隐式地从int转换为无符号类型unsigned long int,对于集合的数量为负的值,它可能有一个反直觉的值

要使此警告静音,您可以:

更改initSetArray的原型以修复参数的类型:集合的数量\u和块的数量\u可能应该是类型为size\t的无符号值:

或者,可以使用强制转换操作符添加显式转换:

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

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

警告是在非常严格的警告设置下产生的,因为\u集的值number\u被隐式地从int转换为无符号类型unsigned long int,对于\u集的number\u的负值,该值可能具有反直觉的值

要使此警告静音,您可以:

更改initSetArray的原型以修复参数的类型:集合的数量\u和块的数量\u可能应该是类型为size\t的无符号值:

或者,可以使用强制转换操作符添加显式转换:

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

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

这不是您的问题,但如果您希望调用者看到分配的setarray,则需要传递set**而不是set*这不是您的问题,但如果您希望调用者看到分配的setarray,则需要传递set**而不是set*