2015-04-03 137 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的其他元素(假設數組大小正在增加)。