Следуя советам C FAQ on instantiating a matrix using a double pointer, я наткнулся на другую проблему. Мне удалось решить проблему, но мне трудно понять, почему она работает в одном направлении, но не в другом.Изменение переменной, переданной по ссылке, и возврат ее из функции
У меня есть следующий код, который работает, а затем я покажу вам немного, что не работает, и я надеюсь, что вы можете объяснить, почему:
#include <stdio.h>
#include <stdlib.h>
int HEIGHT = 20;
int WIDTH = 20;
int ** curr_grid;
/**
* Generate an array with the given height and length
*/
int ** create_grid() {
int ** grid;
grid = malloc(sizeof(int *) * HEIGHT);
int row;
for (row = 0; row < HEIGHT; row++)
grid[row] = malloc(sizeof(int) * WIDTH);
return grid;
}
/* Entry Point main */
int main(int argc, char** argv) {
curr_grid = create_grid();
curr_grid[0][0] = 0;
free(curr_grid); // Release heap resources
return 0;
}
Выделяя память для сетки и возвращая указатель таким образом работает. Тем не менее, я впервые попробовал еще один способ, который я был убежден, должен также работать, но это не делает:
#include <stdio.h>
#include <stdlib.h>
int HEIGHT = 20;
int WIDTH = 20;
int ** curr_grid;
/**
* Generate an array with the given height and length
*/
create_grid(int ** grid) {
grid = malloc(sizeof(int *) * HEIGHT);
int row;
for (row = 0; row < HEIGHT; row++)
grid[row] = malloc(sizeof(int) * WIDTH);
}
/* Entry Point main */
int main(int argc, char** argv) {
create_grid(curr_grid);
curr_grid[0][0] = 0; // Segmentation Fault
free(curr_grid); // Release heap resources
return 0;
}
Действовать таким образом завершается с ошибкой сегментации по линии, указанной. Однако у меня создалось впечатление, что передача переменной по ссылке позволяет вам ее модифицировать.
Почему это не сработало?
«сетка» внутри функции - это ** копия ** параметра, который передается из 'main' ... –
ваш заголовок говорит« передано по ссылке », но вы на самом деле этого не делаете. –
Это, вероятно, означает, что я полный новичок C. Если у вас есть идеи по переименованию вопроса, я был бы очень благодарен. – mydoghasworms