2015-03-03 3 views
2

Я занимаюсь разработкой приложения на C++. Я выделил память, но я получил ошибку Thread 1: EXC_BAD_ACCESS (code=2,address=0x8) в файле superfile.cpp. Вот мой код:Тема 1: EXC_BAD_ACCESS (код = 2, адрес = 0x8) Ошибка C++

superfile.h

struct Node{ 
     Voxel *data; 
     Node *next; 
    }; 

superfile.cpp

int* cnt =(int*)calloc(_width*_height,sizeof(int)); 
    Voxel *temp =(Voxel *)calloc(_width*_height,sizeof(Voxel)); 
    Node *list=(Node *)calloc(_width*_height*2,sizeof(Node)); 

list[(_width*_height)+l].next = list[_width*yy + xx].next->next; // Thread 1: EXC_BAD_ACCESS (code=2,address=0x8) Error c++ 

после отладки значения переменных:

_width=60 
_height=45 
l=3 
yy=4096 
xx=-3345 

Любой идея, что такое g Начать? Спасибо

enter image description here

+0

Что такое 'xx' и' yy'? – ForceBru

+0

@ForceBru xx = -3345 и yy = 4096 и объявлен как int xx = (int) floor (x + 0,5); int yy = (int) floor (y + 0.5); –

+0

Я имею в виду, откуда они взялись? Это вы, кто вручную установил эти значения или они каким-то образом оценены? – ForceBru

ответ

2

Вы выделения не хватает памяти. Здесь размер list составляет 60 * 45 * 2 = 5400 элементов. Вы пытаетесь получить доступ к элементу 60 * 4096-3345 = 242415.

Это доступ к памяти, которая не относится к памяти, связанной с list. 242415-й элемент не существует. Это SegmentationFault.

Чтобы справиться с этим, вам нужно использовать что-то вроде calloc(_width*_height*100,sizeof(...));. Тем не менее, вы потеряете много памяти.

Кроме того, вы никогда не выделяете память для next и next->next. Попробуйте

list[_width*yy + xx].next=calloc(50, sizeof(...)); 
list[_width*yy + xx].next->next=calloc(50, sizeof(...)); 
list[(_width*_height)+l].next = list[_width*yy + xx].next->next; 

50 Здесь просто случайное число, я не знаю, сколько пространства ли ваш struct потреблять.

+0

все еще не работает чувак. пожалуйста, найдите мой отредактированный вопрос. Спасибо. я проголосовал за вас. –

+0

@RehanK, я был бы признателен, если бы вы перестали называть меня «чуваком» – ForceBru

1

Вы разыменования нулевого указателя здесь:

list[(_width*_height)+l].next = list[_width*yy + xx].next->next; 
                 ^^^^^^ 

Значение в list[_width*yy + xx].next является 0 как инициализируется calloc.

+0

большое спасибо –

+0

не могли бы вы ссылку на чтение. im с большим количеством проблем в отношении обработки памяти C++ и многозадачности спасибо –

+0

@RehanK Прежде всего, это не обработка памяти C++, это обработка памяти C. C++ использует 'new' и' delete', а не 'calloc'. Во-вторых, на C++ вам даже не нужно было заниматься ручным управлением памятью ... Я не собираюсь вам ничего связывать, вы можете использовать все то, что вам нужно. StackOverflow даже имеет [список хороших книг на C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), который я рекомендую проверить и выбрать. Прежде чем приступать к ручному управлению памятью, сначала изучите основы языка. – emlai

Смежные вопросы