[英]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.