簡體   English   中英

在c中復制數組的一部分時出現分段錯誤

[英]Segmentation fault when copying a portion of an array in c

我這里有一個函數,可以將數組的一部分(從頭到尾)復制到新數組中。 當我運行代碼時,我最終遇到段錯誤。 我知道,當我沒有為陣列分配足夠的空間或嘗試訪問尚未分配的內存時,就會發生段錯誤。 但是對於我的len來說,我已經將其設置為last-first + 1了,它應該足以包含要復制的數組部分。 但是為什么它仍然給我段錯誤? 還是我錯過了什么?

這是我完成的代碼的結構:

typedef struct {
  int* data;
  unsigned int len;
} intarr_t;

這是將數組部分復制到新數組的功能:

intarr_t* intarr_copy_subarray( intarr_t* ia, 
                unsigned int first, 
                unsigned int last )
{
    unsigned int len = last-first+1;
    intarr_t* newia = malloc(sizeof(intarr_t));
    assert (newia);
    newia->data = malloc(sizeof(int)*len);
    assert (newia->data);
    newia->len = len;
    if (newia == 0 || ia == NULL || last < first)
    { 
        return NULL;
    }
    else
    {
        for (int x = first; x <= last; x++)
        {
            memcpy (newia->data[x], ia->data[x], (len*sizeof(int)));
        }
        return newia;
    }
    free (newia);
    return 0;
}

更改這些陳述

    for (int x = first; x <= last; x++)
    {
        memcpy (newia->data[x], ia->data[x], (len*sizeof(int)));
    }

memcpy ( newia->data, ia->data + first, len * sizeof( int ) );

或者

    for ( unsigned int i = 0; i < len; i++ )
    {
        newia->data[i] = ia->data[i + first];
    }

也是這種情況

if (newia == 0 || ia == NULL || last < first)
{ 
    return NULL;
}

是錯誤的。 如果ia等於NULL或last <first,則必須在此塊中釋放分配的內存。

您應該在分配內存之前檢查這些條件。

這是因為for循環中存在memcpy語句。 請注意,當您提供newia-> data [x]時,它將在該特定指針處轉換為整數值。

例如,數據指向一個整數變量,其值類似於newia-> data [x] = 2,第二個指向另一個整數變量ia-> data [x] = 3,則您的memcpy變為

memcpy(2,3,len * sizeof(int));

因此,有效的結果是您最終將數據從地址3復制到地址2,而這兩個地址都不由您分配。

您需要遵循莫斯科的弗拉德(Vlad)建議的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM