尝试运行*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;
}
答案 0 :(得分:5)
此代码:
HNum *HNum_alloc()
{
HNum *newNum;
newNum->a = (char*)malloc(2*sizeof(char));
if(!newNum->a) return NULL;
newNum->a = "0";
return newNum;
}
错误的线条比正确的线条错误,我很害怕。 :/你没有指定哪些行可以获得编译器警告,但这几乎无关紧要:它永远不会与那里的代码一起使用。
(void)
,空括号不表示"没有参数"我C。newNum
分配内存。sizeof (char)
,它总是1。"0"
的指针覆盖已分配的指针。所以,它应该是这样的:
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;
}