2015-04-03 98 views
0

我在尝试调整数组的大小以包含长度为“newlen”的值。如果newlen小于原始数组长度,则数组的末尾将被丢弃。如果newlen更大,则新整数应为零。我想出了这个功能,但是当我测试它时,我会遇到分段错误。我也不知道如何添加零到最后,我如何跟踪索引,以便我可以在最后添加int零点?我做了第一个案例(newlen小于len),但不知道如何处理其他案例。调整数组的大小(c)

下面是该阵列结构:

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

这个代码是一个很大的错误,'我'没有被初始化,'len'是未知的变量,'tmp'没有被使用,'newlen'没有被使用,'双重无限'...这个代码不应该根本编译 – 2015-04-03 23:52:04

+0

确保'newlength'不是'1'。更好,但确保它是两个幂 – 2015-04-03 23:55:38

+0

此代码不编译。在尝试解决运行时错误(如分段错误)之前:启用编译器错误和警告,修复所有报告的内容,并确保发布准确的代码。 – 2015-04-04 00:15:35

回答

1

当你不使用它的循环可能是因为在此之前初始化我的任何地方。

也为代码

for (m; newlength < p->len; m++) 

你在哪里重新初始化为loop.Also的第二和其它将此值传递两个循环是无限循环。

要实现,你可以做这样的事情

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 
     } 
    } 
} 
+0

你好,对不起我的功能不全,我忘了把主要文件。我测试了这个代码,它不会将数组的大小调整到正确的len。也许是因为它没有添加第一个案例的元素? – Andrew 2015-04-04 03:58:57

+0

你得到的尺寸有什么区别 – 2015-04-04 04:05:11

+0

嗯,我想这是因为你没有考虑len是0的情况。差异是1。 – Andrew 2015-04-06 06:10:39

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; 
} 

我假定tmpold_pointer是在上述相同的类型。

然后,您可以初始化old_pointer的其他元素(假设数组大小正在增加)。