簡體   English   中英

我有一個意外的緩沖區溢出警告,為什么會這樣?

[英]I have an unexpected buffer overrun warning, why do I have that?

我必須以這種方式創建一個對向量的分量求和的函數:

  • 第一個+第二個,
  • 第三+第四,
  • 第 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++; 
        }

我試圖解釋警告,結果 [] 中似乎沒有足夠的空間,但它工作正常並且它正確地完成了它的工作(我已經逐行調試來說明這一點)。

您會收到警告,因為如果size是奇數,那么您將在vect末尾閱讀元素。 想象一下如果 size 為 3 會發生什么:

  1. 一開始,你有i=0,j=0; .
  2. result[0] = vect[0]+vect[1];
  3. j++ j 現在是 1。
  4. i+=2; . 我現在是 2。
  5. result[1] = vect[2]+vect[3];

但是,由於vect的大小為 3,因此嘗試讀取vect[3] (您是)將(很可能)產生分段錯誤。

暫無
暫無

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

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