簡體   English   中英

將malloc用於2D數組指針會導致分段錯誤

[英]Using malloc for 2D array pointer causes segmentation fault

我在initializeStruct函數中遇到分段錯誤。 我想要一個2D數組指針。 每個2D數組索引都包含三種類型的結構。

這是結構:

struct cacheLine {
    int validBit;
    int tag;
    int LRUcounter;
};

這是失敗的方法:

void initializeStruct(struct cacheLine **anyCache){
    int i, j;
    for (i=0;i<S;i++){
        for(j=0;j<E;j++){
            anyCache[i][j].validBit = 0; //I am getting a Segmentation fault
            anyCache[i][j].tag = 0;
            anyCache[i][j].LRUcounter = 0;
        }
    }
    return;
}

在主要方面,我使用malloc創建2D數組指針:

int main(int argc, char** argv){
int opt;
char *t;

//looping over arguments from command line
while(-1 != (opt = getopt(argc, argv, "s:E:b:t:"))){
    //determine which argument it's processing
    switch(opt){
        case 's':
            s = atoi(optarg);
            break;
        case 'E':
            E = atoi(optarg);
            break;
        case 'b':
            b = atoi(optarg);
            break;
        case 't':
            t = optarg;
            break;
        //too many arguments
        default:
            printf("wrong argument\n");
            break;
    }
}
//create array
S = 1 << s;
B = 1 << b;

//allocate memory
struct cacheLine **cacheArray =  malloc(sizeof(struct cacheLine)*S*E);

//Initialize Structs
initializeStruct(cacheArray);

您剛malloc的方式是數組的第一維。 你需要malloc每個行:

struct cacheLine **cacheArray =  malloc(sizeof(struct cacheLine*)*S);
for(i = 0;i < S;i++) {
    cacheLine[i] = malloc(sizeof(struct cacheLine) * E);
}

您正在聲明一個2D數組,即一個指針數組。 為此,您要分配一個存儲區。

您的期望:

array_0_0, array_0_1, ..., array_0_s
array_1_0, array_1_1, ..., array_1_s
...

您實際聲明的內容:

array_0 -> NULL
array_1 -> NULL
...
array_n -> NULL
lots of wasted space

您可以將1D數組與malloc一起使用,並計算索引(i * E + j),也可以堅持使用2d數組,然后分別初始化行。 我建議使用一維數組。

您的malloc錯誤-您想在第一個malloc中分配S ,然后再為每個malloc E項目分配S 相反,您正在分配S*E並且永遠不要將它們指向任何東西

暫無
暫無

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

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