我尝试调整数组大小以包含长度为" newlen"的值。如果newlen小于原始数组长度,则丢弃数组的末尾。如果newlen更大,则新整数应为零。我想出了这个功能,但是当我测试它时,我得到了分段错误。我也不知道如何将零添加到最后,我如何跟踪索引以便我可以在结尾添加零?我做了第一个案例(newlen小于len),但不知道如何处理另一个案例。
这是阵列的结构:
typedef struct {
int* data;
unsigned int len;
} intarr_t;
我的功能:
array_size( intarr_t* p, unsigned int newlength )
{
int i,m = 0;
if (newlength < len)
int *tmp;
tmp = realloc(p->data, (p->newlen)* sizeof *p->data);
if(tmp)
{
for (i; newlength < p->len; i++)
{ for (m; newlength < p->len; m++)
{
p->data[i] = p->data[m];
}
}
}
}
答案 0 :(得分:1)
由于你没有在任何地方初始化我之前在循环中使用它可能是因为它。
还有代码
for (m; newlength < p->len; m++)
你在哪里为for循环的第二次和其他传递初始化这个值。同时两个循环都是无限循环。
要实现第二种情况,您可以执行类似的操作
if(newlength > p->len)
{
int old_length = p->len;
p = realloc(p->data, newlength * sizeof(p->data));
if(p)
memset(p + old_length,0,(newlength - old_length) * sizeof(p->data));
}
您的整个工作职能将如下
array_size( intarr_t* p, unsigned int newlength ) {
intarr_t * tmp;
if(newlength < p->len) {
tmp = realloc(p->data, newlength * sizeof(p->data)); //realloc will automatically discard elements after new length
if(tmp) {
p = tmp;
p->len = newlength;
}
}
else if(newlength > p->len)
{
int old_length = p->len;
tmp = realloc(p->data, newlength * sizeof(p->data));
if(tmp){
p = tmp;
p->len = newlength;
memset(p + old_length,0,(newlength - old_length) * sizeof(p->data));//for setting trailing element to 0
}
}
}
答案 1 :(得分:1)
提供给realloc()
(p->data
)的指针不会更改。
realloc()的使用通常需要像这样
tmp = realloc(old_pointer, new_number * sizeof(*tmp));
if (tmp == NULL)
{
/* an error occur and old_pointer remains unchanged */
/* need to recover */
}
else
{
old_pointer = tmp;
length = new_number;
}
我假设tmp
和old_pointer
与上述类型相同。
然后你可以初始化old_pointer
的其他元素(假设数组大小正在增加)。