【问题标题】:Pointer and Integer issues in CC中的指针和整数问题
【发布时间】:2021-03-04 19:14:09
【问题描述】:

函数在等待指针,但我想在函数查找中返回一个整数(我无法修改函数的返回类型),我该如何解决这个问题?

int hashtable_insert(HashTable ** ptable, void *data, void (*delete) (void *))
    {
        if(hashtable_lookup(*ptable, data) != -1){
            return -1;
            }
    
     data = malloc(sizeof(size_t));
     list_append((*ptable)->list, data, (*ptable)->size);
     _hashtable_resize(ptable);
    
        return 0;
    }

警告:指针和整数的比较 if(hashtable_lookup(*ptable, data) != -1){

void * hashtable_lookup(HashTable * table, void *data)
{
for(int i = 0; i < (table)->length; i++){
    if((table)->list[i] == data){
            return data;
        }
    }
return -1;
}

警告:return 从整数中生成指针而不进行强制转换 [-Wint-conversion] 返回 -1;

【问题讨论】:

    标签: c pointers integer return


    【解决方案1】:

    函数在等待指针,但我想在函数查找中返回一个整数(我无法修改函数的返回类型),我该如何解决这个问题?

    如果函数返回 void * 并且您无法更改它,则返回整数根本不是一种选择。您可以返回一个整数转换为一个指针(并将返回值与类似值进行比较),但除非您的哈希表支持空值,否则空指针会产生更好的失败代码:

    void * hashtable_lookup(HashTable * table, void *data) {
        // look up data ...
    
        // lookup failed
        return NULL;
    }
    
    // ...
    
            if (hashtable_lookup(*ptable, data) != NULL) {
                // data is already present in the hash table
                return -1;
            }
    

    但如果空指针是表的有效数据,那么

    void * hashtable_lookup(HashTable * table, void *data) {
        // look up data ...
    
        // lookup failed
        return (void *) -1;
    }
    
    // ...
    
            if (hashtable_lookup(*ptable, data) != (void *) -1) {
                // data is already present in the hash table
                return -1;
            }
    

    【讨论】:

      【解决方案2】:

      第一个警告是因为您将void*int 进行比较。第二个是因为您返回的是 int 而不是指针。

      您可以在这里和那里添加强制转换以删除警告(if(hashtable_lookup(*ptable, data) != (void*)(-1)){return (void*)(-1);,但它会更难阅读且更容易出错,因为您通常会检查指针是否为 NULL,但不会有所不同比“-1”。

      通常,您会返回一个 NULL 指针来指示函数失败。此外,您可能有 if(hashtable_lookup(*ptable, data) != -1){ 错误,因为看起来当 hasthable_lookup() 返回 -1 时它失败了。

      我想这就是你要找的。​​p>

      int hashtable_insert(HashTable ** ptable, void *data, void (*delete) (void *))
      {
          if(hashtable_lookup(*ptable, data) == NULL){
              return -1;
          }
      
          data = malloc(sizeof(size_t));
          list_append((*ptable)->list, data, (*ptable)->size);
          _hashtable_resize(ptable);
      
          return 0;
      }
      
      void * hashtable_lookup(HashTable * table, void *data)
      {
          for(int i = 0; i < (table)->length; i++){
              if((table)->list[i] == data){
                  return data;
              }
          }
          return NULL;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多