我必須以這種方式創建一個對向量的分量求和的函式:
- 第一個 第二個,
- 第三 第四,
- 第 5 次 第 6 次,依此類推。
原始向量的大小為“大小”。我必須動態創建一個大小為“size/2”的結果向量(因為以這種方式求和,我將原始向量大小減半)。
我使用了兩個計數器,i 和 j,“i”是原始向量的計數器,“j”是向量“結果”的計數器。我認為問題就在這里,因為我有一個緩沖區溢位警告。
這是我的代碼:
#include <stdint.h>
#include <stdlib.h>
uint32_t* add_twobytwo(uint32_t* vect, size_t size) {
if (vect == NULL) {
return NULL;
}
uint32_t* result = malloc((size / 2) * sizeof(uint32_t));
if (result == NULL) {
return NULL;
}
size_t j = 0;
for (size_t i = 0; i < size; i = 2) {
result[j] = vect[i] vect[i 1];
j ;
}
return result;
}
int main(void)
{
size_t n = 6;
uint32_t* v = malloc(n * sizeof(uint32_t));
if (v == NULL) {
return NULL;
}
v[0] = 3; v[1] = 87; v[2] = 5; v[3] = 7; v[4] = 12; v[5] = 9;
uint32_t* sum = add_twobytwo(v, n);
free(v);
free(sum);
return 0;
}
綠色曲線位于此處:
for (size_t i = 0; i < size; i = 2) {
result[j] = vect[i] vect[i 1];
j ;
}
我試圖解釋警告,結果 [] 中似乎沒有足夠的空間,但它作業正常并且它正確地完成了它的作業(我已經逐行除錯來說明這一點)。
uj5u.com熱心網友回復:
您會收到警告,因為如果size很奇怪,那么您將閱讀 . 結尾之后的元素vect。想象一下如果 size 為 3 會發生什么:
- 起初,你有
i=0,j=0;. result[0] = vect[0] vect[1];j. j 現在是 1。i =2;. 我現在是 2。result[1] = vect[2] vect[3];
但是,由于vect大小為 3,因此嘗試讀取vect[3](您是)將(很可能)產生分段錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/474093.html
