得到几个错误,包括“非法使用此类型作为表达式”

时间:2014-06-29 09:20:37

标签: c

尝试运行*HNum_clone函数时,我遇到了几个错误。可能缺少一些真正愚蠢的东西? HNum应该代表任意长度。

typedef struct _HNum 
{
    char *a;
}HNum;

/*
 * Allocates a new HNum and sets its value to 0.
 * RETURN VALUE:
 *   Returns a pointer to the new number, or NULL if the allocation failed.
 */
HNum *HNum_alloc()
{
    HNum *newNum;
    newNum->a = (char*)malloc(2*sizeof(char));
    if(!newNum->a) return NULL;
    newNum->a = "0";
    return newNum;
}

/*
 *Allocates a new HNum with the same value as hnum. It is the caller's
 * responsibility to free the returned HNum.
 * RETURN VALUE:
 *   Returns a pointer to the new number, or NULL if the allocation failed.
 */
HNum *HNum_clone(const HNum *hnum)
{
    if(!hnum)
    {
        return NULL;
    }
    HNum *newNum = HNum_alloc();
    if (hnum->a) {
        strcpy(newNum->a, hnum->a);
    }
    else
    {
        newNum->a = NULL;
    }
    return newNum;
}

*更改为以下代码,仍然遇到相同的错误:

HNum *HNum_alloc(void)
{
    HNum *newNum = (HNum*)malloc(sizeof *newNum);
    if(newNum != NULL)
    {
        newNum->a = (char*)malloc(2);
        if(newNum->a != NULL)
        {
            strcpy(newNum->a, "0");
            return newNum;
        }
    free(newNum);
    }
  return NULL;
}

HNum *HNum_clone(const HNum *hnum)
{
    if(!hnum)
    {
        return NULL;
    }
    HNum *newNum = (HNum*)malloc(sizeof *newNum);
    if(newNum != NULL)
    {
        newNum->a = (char*)malloc(strlen(hnum->a)+1);
        if(newNum->a != NULL)
        {
            strcpy(newNum->a, hnum->a);
            return newNum;
        }
    }
    return NULL;
}

HNum_clone更改为以下内容,似乎现在正在运行。看起来问题是在函数的开头没有定义HNum *newNum ...

HNum *HNum_clone(const HNum *hnum)
{
    HNum *newNum = HNum_alloc();
    if(!hnum)
    {
        return NULL;
    }
    if(newNum != NULL)
    {
        free(newNum->a);
        newNum->a = (char*)malloc(strlen(hnum->a)+1);
        if(newNum->a != NULL)
        {
            strcpy(newNum->a, hnum->a);
            return newNum;
        }
    }
    return NULL;
}

2 个答案:

答案 0 :(得分:5)

此代码:

HNum *HNum_alloc()
{
    HNum *newNum;
    newNum->a = (char*)malloc(2*sizeof(char));
    if(!newNum->a) return NULL;
    newNum->a = "0";
    return newNum;
}

错误的线条比正确的线条错误,我很害怕。 :/你没有指定哪些行可以获得编译器警告,但这几乎无关紧要:它永远不会与那里的代码一起使用。

  1. 该函数应为(void),空括号表示"没有参数"我C。
  2. 您必须为newNum分配内存。
  3. 你永远不应该使用sizeof (char),它总是1。
  4. 使用指向字符串常量"0"的指针覆盖已分配的指针。
  5. 所以,它应该是这样的:

    HNum * HNum_alloc(void)
    {
      HNum *newNum = malloc(sizeof *newNum);
      if(newNum != NULL)
      {
        newNum->a = malloc(2);
        if(newNum->a != NULL)
        {
          strcpy(newNum->a, "0");
          return newNum;
        }
        free(newNum);
      }
      return NULL;
    }
    

    您可以使用strdup()代替内部分配。但请注意,如果在字符串缓冲区中存储已分配的空间量,那么编写高效的数字实现会更容易 ,那么您可以避免重新分配它。此外,您应该再分配超过所需的位数,以防止过于频繁的重新分配(这是非常昂贵的)。

    HNum_clone()中发生类似错误,您必须为两者顶层HNum结构,分配内存,以查找指向的数据按a。两者都没有神奇地发生。

答案 1 :(得分:0)

试试这个:

HNum *HNum_clone(const HNum *hnum)
{
    if(!hnum)
    {
        return NULL;
    } else {
        HNum *newNum = (HNum*)malloc(sizeof *newNum);
        if(newNum != NULL)
        {
            newNum->a = (char*)malloc(strlen(hnum->a)+1);//hnum->a != NULL
            if(newNum->a != NULL)
            {
                strcpy(newNum->a, hnum->a);
                return newNum;
            }
        }
    }
    return NULL;
}