簡體   English   中英

堆棧溢出 C++

[英]Stack overflow C++

這是我的代碼。 當我在 initImg function 中訪問 dtr 數組時,它給出了堆棧溢出異常。 可能是什么原因?

#define W 1000
#define H 1000
#define MAX 100000 
void initImg(int img[], float dtr[])
{
    for(int i=0;i<W;i++)
        for(int j=0;j<H;j++)
            img[i*W+j]=255;

    for(int j=0;j<H;j++)
    {
        img[j] = 0;
        img[W*(W-1)+j] = 0;
    }
    for(int i=0;i<W;i++)
    {
        img[i*W] = 0;
        img[i*W+H-1] = 0;
    }
    for(int i=0;i<W;i++)
        for(int j=0;j<H;j++)
        { 
            if(img[i*W+j]==0)
                dtr[i*W+j] = 0;    // <------here
            else
                dtr[i*W+j] = MAX;  // <------here
        }
}
int main()
{
    int image[W*H];
    float dtr[W*H];
    initImg(image,dtr);
    return 0;
}

這個:

int image[W*H];
float dtr[W*H];

在堆棧中創建一個 4 * 1000 * 1000 ~ 4 MB 數組。 堆棧空間有限,通常小於 4 MB。 不要那樣做,使用 new 在堆中創建 arrays。

int *image = new int[W*H];
float *dtr = new float[W*H];

您的堆棧可能不足以容納一百萬個整數和一百萬個浮點數 (8MB)。 因此,一旦您嘗試訪問超出堆棧大小的內容,您的操作系統就會向您拋出錯誤。 需要在堆上分配大於一定大小的對象或 arrays - 最好使用自我管理的自我邊界檢查 class 例如std::vector - 具體大小取決於您的實現。

除了堆棧溢出之外,您還有另一個問題 - 一個被您的 W 和 H 定義所掩蓋的問題。

for(int i=0;i<W;i++)
    for(int j=0;j<H;j++)
    { 
        if(img[i*W+j]==0)
            dtr[i*W+j] = 0;    // <------here
        else
            dtr[i*W+j] = MAX;  // <------here
    }

您的 i 循環應該從 0 計數到 H-1,而不是 W-1(並且 j 循環也應該交換)。 否則,您的代碼只有在 W==H 時才能正常工作。 如果 WH 你會溢出你的緩沖區。

同樣的問題也存在於您的代碼示例中的其他地方。

您正在堆棧上創建巨大的 arrays。 只需使用std::vector代替:

std::vector<int> image(W*H);
std::vector<float> dtr(W*H);

你的堆棧已滿。 您可以在堆中分配 memory 或增加堆棧 memory。 據我所知,最大大小約為 8MB,但這不是一個好主意。 最好的解決方案是使用堆分配或 std 中可用的一些容器(向量)。

你最終會到達

dtr[W*W+j] = 0;   <------here

這比您分配的要多得多。

您的編譯器將定義堆棧大小。 解決此問題的一種方法是使用 std::vector array_one(W*H) 動態分配 arrays。

您正在嘗試從堆棧中分配 memory 。 可以使用堆棧分配的最大 memory 取決於編譯器。 所以嘗試這樣的事情來避免這種異常。

#include <stdlib.h>
#define W 1000
#define H 1000 
#define MAX 100000 
void initImg(int img[], float dtr[]) 
{ 
for(int i=0;i<W;i++) 
for(int j=0;j<H;j++) 
img[i*W+j]=255; 

for(int j=0;j<H;j++) 
{ 
img[j] = 0; 
img[W*(W-1)+j] = 0; 
} 
for(int i=0;i<W;i++) 
{ 
img[i*W] = 0; 
img[i*W+H-1] = 0; 
} 
for(int i=0;i<W;i++) 
for(int j=0;j<H;j++) 
{ 
if(img[i*W+j]==0) 
dtr[i*W+j] = 0; // <------here 
else 
dtr[i*W+j] = MAX; // <------here 
} 
} 
int main() 
{ 
int *image = (int*)malloc(4*W*H);   //Malloc the memory....(Allocated from Heap..)
float *dtr = (float*)malloc(4*W*H);

if(image && dtr) //If none of the ptr is NULL. Means memory is allocated...
{
initImg(image,dtr); 
}
return 0; 
}

您也可以使用 new 而不是使用 malloc 從堆中分配 memory ...

暫無
暫無

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

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