簡體   English   中英

為什么我在寫入“ptr”時收到“C6386”緩沖區溢出警告?

[英]Why am I getting warning 'C6386' Buffer overrun while writing to 'ptr'?

在此示例中,變量“大小”為 10。 如果我用硬編碼 10 代替“int(size)”,超限警告就會消失。 為什么會發生這種情況的任何建議/推理? 我想為我的指針分配 80 個字節,每個分配的值都是給定時間跨度的一個時間步長。

謝謝!

int main() {
    const double h = 0.1;
    const double tspan[2] = { 0.0, 1.0 };
    const double size =round(tspan[1] / h);
    double *ptr = (double*)malloc(int(size) * sizeof(double));

    if (!ptr) {
        cout << "Memory Allocation Failed";
        exit(1);
    }

    double j = 0;
    for (int i = 0; i < size; i++) {
        ptr[i] = j;
            
        //cout << j << '\n';
        j++;
    }

    cout << '\n';
    for (int i = 0; i < size; i++) {
        cout << *(ptr + i) << endl;
        //cout << i << '\n';
    }
    
    
    free(ptr);
    return 0;
}

我試過取消引用指針並確保它不是 NULL。 我也打印了結果。 結果是一個計數 0-9 的指針。 `

double size可以是10.1 ,條件i < 10.1不終止循環如果i是 10,分配的緩沖區大小是int(10.1) ,即 10, ptr[10]導致緩沖區溢出。

作為 273K 回答的補充,您 csn 通過將size作為std::size_t變量來解決這個問題。

讓我們對該除法的結果進行 floor 並轉換為int

int main() {
    const double h = 0.1;
    const double tspan[2] = { 0.0, 1.0 };
    const int size = static_cast<int>(std::floor(tspan[1] / h));
    double *ptr = (double*)malloc(size * sizeof(double));

    if (!ptr) {
        cout << "Memory Allocation Failed";
        exit(1);
    }

    double j = 0;
    for (int i = 0; i < size; i++) {
        ptr[i] = j;
            
        //cout << j << '\n';
        j++;
    }

    cout << '\n';
    for (int i = 0; i < size; i++) {
        cout << *(ptr + i) << endl;
        //cout << i << '\n';
    }
    
    free(ptr);
    return 0;
}

更好的是,讓我們使用 new 和 delete 而不是 malloc 和 free。

int main() {
    const double h = 0.1;
    const double tspan[2] = { 0.0, 1.0 };
    const int size = static_cast<int>(std::floor(tspan[1] / h));
    double *ptr = new double[size];

    if (!ptr) {
        std::cout << "Memory Allocation Failed";
        exit(1);
    }

    double j = 0;
    for (int i = 0; i < size; i++) {
        ptr[i] = j;
            
        //std::cout << j << '\n';
        j++;
    }

    std::cout << '\n';
    for (int i = 0; i < size; i++) {
        std::cout << *(ptr + i) << std::endl;
        //cout << i << '\n';
    }
    
    delete[] ptr;
    return 0;
}

更好的是,使用std::vector

int main() {
    const double h = 0.1;
    const double tspan[2] = { 0.0, 1.0 };
    const int size = static_cast<int>(std::floor(tspan[1] / h));
    std::vector<double> vec(size);

    double j = 0;
    for (auto &x : vec) {
        x = j;
            
        //std::cout << j << '\n';
        j++;
    }

    std::cout << '\n';
    for (auto x : vec) {
        std::cout << x << std::endl;
        //std::cout << i << '\n';
    }

    return 0;
}

round()四舍五入到最接近的整數。 如果有的話,你應該使用ceil()四舍五入

暫無
暫無

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

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