2015-12-20 4 views
1

Я хочу изменить один случайный элемент в массиве символов, которые включают '0', '1' и '2'. Только '0' может быть изменен, поэтому я сначала помещаю их индексы в другой массив (если есть способ сделать это более эффективно, я бы с радостью его изменил).Ошибка трассировки стека с массивом как аргумент

Однако я получаю

cygwin_exception::open_stackdumpfile: Dumping stack trace 

Я знаю, что проблема исходит от этой функции

void ai_move(char (*array)[10]) 
{ 
    srand (time(NULL)); 

    unsigned char* possible_indexes = {0}; 
    int cpt = 0; 
    for (int i = 0; i < MAXDATASIZE - 1; ++i) 
     if ((*array)[i] == '0') 
     { 
      possible_indexes[cpt] = i; 
      ++cpt; 
     } 
    int rand_index = rand() % (sizeof(possible_indexes) - 1); 
    (*array)[possible_indexes[rand_index]] = '1'; 
} 

, которую я называю так:

ai_move(&grid); 

grid содержит массив символов I требуется изменить и определяется как:

char grid[MAXDATASIZE] = {'0', '0', '0', '0', '0', '0', '0', '0', '0'}; 

Я знаю, что проблема может возникнуть из-за того, что я даю grid в качестве аргумента, но после нескольких часов поиска я не смог найти решение, которое могло бы изменить что-либо.

Спасибо, что помогли мне.

+0

Вы уверены, что длина вашего массива равна MAXDATASIZE? – Ashalynd

+2

Вероятно, вы пытаетесь получить segfault при попытке доступа к 'possible_indexes [cpt]', поскольку 'possible_indexes' содержит только одно значение. – ForceBru

+0

В вашем массиве grid есть только 9 записей. Что такое MAXDATASIZE? Это 10? – Ashalynd

ответ

3
unsigned char* possible_indexes = {0};  

Ну, вы объявляете указатель, но не выделить достаточно памяти для него (точно не даже выделять память), и попытаться написать в неправильном месте на более поздних итераций.

possible_indexes[cpt] = i; 

Либо выделить память для possible_indexes первых, а затем попытаться написать или объявить его как массив с желаемым размером.

Примечание -Также относительно sizeof(possible_indexed) в этом -

int rand_index = rand() % (sizeof(possible_indexes) - 1); 

который даст размер указателя, а не то, что обычно было бы желательно т.е. число элементов.

+0

Я впервые объявил его как «unsigned char * possible_indexes;». Будет ли это работать? – Blublublub

+0

@Blublublub No. Если вы объявите его как указатель, выделите память с помощью 'malloc' или объявите как массив' unsigned char possible_indexes [50] '. – ameyCU

+0

Я вижу. Я объявлю его как unsigned char possible_indexes [9], так как это максимальный размер. Как тогда я изменил бы его размер до фактического размера, который у него будет? – Blublublub

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