#c #function #return
#c #функция #Возврат
Вопрос:
Я пытаюсь определить 2D-массив, но я хочу сделать это в функции,
вот мой код:
int** createArray( int columns, int rows)
{
int** array[rows];
for(int i = 0; i < rows; i )
{
array[i] = new int*[columns];
}
for(int i = 0; i <columns; i )
{
for(int j = 0; j < rows; j )
{
array[i][j] = 0;
std::cout <<array[i][j];
}
std::cout<<"n";
}
return *array;
}
int main()
{
int **myArray = createArray(3,5);
for(int k =0; k < 5; k )
{
if( (myArray[0][k] == 0) amp;amp; (amp;myArray[1][k] == 0)) //segmentation fault
{
myArray[2][k] = 10; //segmentation fault
}
delete[] myArray;
}
Но это вызывает ошибки, которые можно рассматривать как комментарии в строках. Я новичок в C и не знаю, как это исправить.
Большое вам спасибо
Комментарии:
1. Ошибка понятна сама по себе. Вы упомянули
int
в качестве возвращаемого типаcreateArray
функции (посмотрите, как писать сигнатуры функций). Измените его на тип переменнойarray
2. Спасибо, но, как я уже сказал, я новичок в C , поэтому для меня ошибка не говорит сама за себя, как я могу ее исправить? Я попытался изменить тип функции на void, но теперь я не могу присвоить созданному массиву имя
3. Что говорит @Cherubim, так это изменить возвращаемый тип
createArray
toint**
. Вы всегда должны возвращать то, что обещаете вернуть!4. @Botje За исключением того, что
array
increateArray
неint**
является ни конвертируемым в это.5. @Mechatrnk Не связывайтесь с
new
самимdelete
собой, пожалуйста. Это не предусмотрено в c , но для чего предназначены стандартные контейнерные классы (т. Е.std::vector<T>
std::array<T,Size>
).
Ответ №1:
Предпочтительнее std::vector
ручное управление памятью:
std::vector<std::vector<int>> createArray(int columns, int rows)
{
return std::vector<std::vector<int>(rows, std::vector<int>(columns));
}
int main()
{
int COLUMNS = 5;
int ROWS = 3;
auto myArray= createArray(COLUMNS, ROWS);
/*
Do stuff
*/
//std::vector handles delete on it's own, no need to clean up
}
Если вы не можете использовать std::vector
по какой-либо причине, это способ инициализации 2D-массива в куче:
int** createArray(int columns, int rows)
{
int** arr = new int*[rows];
for(int i = 0; i < rows; i)
{
arr[i] = new int[columns];
}
return arr;
}
int main()
{
int COLUMNS = 5;
int ROWS = 3;
int** myArray= createArray(COLUMNS, ROWS);
/*
Do stuff
*/
//you need to a delete for every new and delete[] for every new[]
for(int i = 0; i < rows; i)
{
delete[] myArray[i];
}
delete[] myArray;
}