0
Я использую TMX парсер для разбора файла, у меня есть 2D массив называется map1
,
, если я объявляю его статическим, т.е. int map1[w][h]
программа работает нормально.
Но об объявлении его в динамике (через таНос & 2D указатель), я получаю ошибку сегментации:Сегментация Неисправность оператора возврата
int main()
{
Tmx::Map map;
int width,height;
map.ParseFile("new.tmx");
if (map.HasError())
{
cerr<<"Error loading map:"<< map.GetErrorText();
return 1;
}
const Tmx::Layer* current_layer = map.GetLayer(0);
width = current_layer->GetWidth();;
height = current_layer->GetHeight();
cout<<"\n\n";
// int map1[height][width];
int **map1;
map1=(int**)malloc(height*sizeof(int*));
for(int i=0;i<width;i++)
map1[i]=(int*)malloc(width*sizeof(int));
for (int i = 0; i < width; i++)
for (int j = 0; j < height; j++)
map1[j][i] = current_layer->GetTileId(i, j);
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
cout.width(3);
cout<< map1[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
я пытался отладки с помощью GDB, я узнать, что «оператор возврата» является причиной ошибки ,
(gdb) backtrace
#0 malloc_consolidate (av=0xb7e83420 <main_arena>) at malloc.c:4151
#1 0xb7d4bbab in _int_free (av=0xb7e83420 <main_arena>, p=<optimized out>, have_lock=0) at malloc.c:4057
#2 0xb7eed9df in operator delete(void*)() from /usr/lib/i386-linux-gnu/libstdc++.so.6
#3 0xb7eeda2b in operator delete[](void*)() from /usr/lib/i386-linux-gnu/libstdc++.so.6
#4 0xb7fcf0eb in Tmx::Layer::~Layer()() from /home/user/Documents/TMX/tmxparser-master/build/libtmxparser.so.1
#5 0xb7fc9b3f in Tmx::Map::~Map()() from /home/user/Documents/TMX/tmxparser-master/build/libtmxparser.so.1
#6 0x08048d4a in main() at main.cpp:69
(gdb) frame 6
#6 0x08048d4a in main() at main.cpp:69
69 return 0;
Вам необходимо перекомпилировать из-за предупреждения «Исходный файл является более поздним, чем исполняемый». Не используйте 'malloc' в C++, используйте стандартные контейнеры, такие как' std :: vector' –
@BasileStarynkevitch здесь используется матрица 2d, чтобы сохранить простую информацию, я временно избегал вектора; вы пытаетесь сказать, что malloc является причиной segfault? можете ли вы подробнее рассказать о malloc в контексте этого кода? –
Вы также можете использовать одномерные массивы, добавить к ним доступ с помощью 'arr [i * width + j]' для элемента матрицы (i, j) –