[英]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.