Error: expression must be a pointer to a complete object type (?)

13,276

You're trying to dereference a void *. That won't work. Try this instead:

if (*(((uint32_t *)box)-1) != rt_tsk_self()) {
Share:
13,276
Admin
Author by

Admin

Updated on June 04, 2022

Comments

  • Admin
    Admin almost 2 years

    This is the function in C that I need to modify. I am trying to have PREVIOUS 4 bytes of address starting from "box" to compare with a returned U32 value from rt_tsk_self(), but it just gives me the error that "expression must be a pointer to a complete object type".

    /*--------------------------- rt_free_box -----------------------------------*/
    
    int rt_free_box (void *box_mem, void *box) {
      /* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */
     if !(defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
      int irq_dis;
     endif
    
      if (box < box_mem || box > ((P_BM) box_mem)->end) {
        return (1);
      }
    
      //MODIFIED***********
      if (*(box-4) != rt_tsk_self()) {  //<--- error:  #852: expression must be a pointer to a complete object type
        return (1);
      }
      //***************
    
    /* 
    other unrelated code
    */
      return (0);
    }
    
  • Kerrek SB
    Kerrek SB over 12 years
    Pedantic note: this is strictly speaking only well defined if the resulting pointer does indeed point to a uint32_t. You're not protected from abuse; the correctness of your program depends on the value of the argument.