簡體   English   中英

在內存中動態分配矩陣時的問題

[英]Problems when dynamically allocating a matrix in memory

如果標題在這個問題上不夠具體,我很抱歉,但是我在使用雙指針時確實遇到了一些奇怪而又不一致的問題,而且我不知道如何用一句話來形容它們。

基本上,每次我的程序運行時,它都會分配一個矩陣,該矩陣的大小是在運行中隨機生成的。

coord mapSize;

mapSize.row = randomRange(3, 5);
mapSize.column = randomRange(5, 7);

char** map = (char**) malloc (mapSize.row * sizeof(char));

for (int i = 0; i < mapSize.row; i++) 
{
    map[i] = (char*) malloc (mapSize.column * sizeof(char));
}

然后矩陣被初始化:

for (int i = 0; i < mapSize.row; i++)
{
    for (int j = 0; j < mapSize.column; j++)
    {
        map[i][j] = CLEAN_FLOOR_SYMBOL;
    }
}

只要矩陣的大小不超過4行,它就可以完美地工作。 如果發生這種情況,則程序只會在初始化到達第五行時崩潰。 奇怪的是,即使行數大於5,初始化到第五行時仍然會出現問題。

我已經通過在初始化循環中打印出一些值來驗證了這一點。

printf("r: %d c: %d\n\n", mapSize.row, mapSize.column);

for (int i = 0; i < mapSize.row; i++)
{
    printf("r: %d | c: ", i);
    for (int j = 0; j < mapSize.column; j++)
    {
        map[i][j] = CLEAN_FLOOR_SYMBOL;
        printf("%d ", j);
    }
    printf("\n");
}

錯誤

這里有6行,但是在嘗試初始化第五行時程序仍然崩潰。

甚至更奇怪的是,在eclipse的控制台上運行程序時,似乎沒有這些問題出現。 那么,我怎么又搞砸了?

 char** map = (char**) malloc (mapSize.row * sizeof(char)); 

您缺少* ,請不要轉換*alloc() *)的結果

char **map = malloc (mapSize.row * sizeof(char*));
//                                            ^
//                                           here

更好:

char **map = malloc (mapSize.row * sizeof(*map));

因為這里的類型是隨map類型而變化的,所以如果要更改類型,您不必記住要在多個地方進行更改。

如果您想要性能,請擺脫** 查找什么是鋸齒狀數組並避免使用它:

size_t num_rows = // ...
size_t num_cols = // ...
char *foo = malloc(num_rows * num_cols * sizeof *foo);

// access:
size_t row = // ...
size_t col = // ...
foo[row * num_rows + col];


*)如果編譯器抱怨您正在使用C ++編譯器來編譯C代碼。

暫無
暫無

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

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