我正在尝试构建一个带有1个参数的函数:数字为char []并返回带有除数作为字符串的char **。
我提出了以下功能,该功能仅适用于某些数字。
char** calc_div(char nr[100])
{
int nri,i,ct=0;
char **a = (char**)malloc(sizeof(char*));
nri = atoi(nr);
for(i=0;i<sizeof(char*);i++)
a[i] = (char*)malloc(sizeof(char));
for(i=1;i<=nri;i++)
if(nri % i == 0)
{
sprintf(a[ct++],"%d",i);
}
return a;
}
这适用于22,33,77这样的数字,但不适用于66或88(它只是卡在某处)。有谁可以帮助我?
答案 0 :(得分:5)
在这么小的空间里有这么多问题......哦,亲爱的!
让我们先考虑一下接口......调用代码如何知道返回多少个值?据推测,指针数组的末尾必须有一个空指针。此外,对于大于1的每个数字,我们知道1和数字本身将是除数,因此我们需要返回至少3个指针的数组。如果一个数字不是素数或一个,那么将有更多的值推入数组。因此,我们需要做的一件事就是密切关注数组中有多少个值。此外,内存释放代码需要逐步执行返回的数组,在释放整个数组之前释放每个字符串。
因此,我们会了解代码应该做些什么。你的代码如何反对这个?
char** calc_div(char nr[100])
{
int nri,i,ct=0;
char **a = (char**)malloc(sizeof(char*));
这会在返回数组中分配一个条目。我们现在知道我们需要至少3倍的空间,我们还必须记录分配的空间。
nri = atoi(nr);
for(i=0;i<sizeof(char*);i++)
a[i] = (char*)malloc(sizeof(char));
这将分配4或8个大小为1字节的字符串,将它们分配给先前分配的大小为1的数组的连续元素。这是数组a
上保证的缓冲区溢出。另外,因为字符串只有大到足以在字符串末尾保存null,所以你不能在那里放任何答案。您应该分配strlen(nr)+1
字节,因为nr
是您需要的数字之一。很明显,数字仅限于3或7个因子(因为您还需要允许终止空指针)。
for(i=1;i<=nri;i++)
if(nri % i == 0)
{
sprintf(a[ct++],"%d",i);
}
if
语句正文中的代码必须准备好在必要时为新因子和数组进行内存分配。
return a;
}
答案 1 :(得分:0)
在
char **a = (char**)malloc(sizeof(char*));
a
有1个指向char的指针的空间......
for(i=0;i<sizeof(char*);i++)
a[i] = (char*)malloc(sizeof(char));
但你尝试写的不只是单个元素(除非sizeof(char*)
碰巧是1)。