Я создал структуру, которая имеет два члена (int
и int**
), и я возвращаю указатель на эту структуру от одной функции до main()
. Достаточно получить доступ к значению int
в структуре. Однако в main()
у меня возникла ошибка сегментации: 11, когда я попытался получить доступ к элементу 2D-массива.Ошибка сегментации при доступе к двумерному массиву в структуре, указатель которой возвращается из функции
#include<stdio.h>
#include<stdlib.h>
typedef struct Square {
int value;
int **array;
} Square;
Square * generate();
int main(int argc, char *argv[]){
Square *sqrptr = generate();
printf("%d\n", sqrptr -> value);
/* It prints 1 */
/* Print out the 2D array */
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3 ; j++){
printf("%d ", *(*((sqrptr -> array) + i) + j));
}
printf("\n");
}
/* It gives segmentation fault */
return 0;
}
Square * generate(){
Square mySquare;
mySquare.value = 1;
mySquare.array = malloc(sizeof(int*) * 3);
/* Initialize the 2D array */
for (int i = 0; i < 3; i++){
*(mySquare.array + i) = malloc(sizeof(int) * 3);
for (int j = 0; j < 3; j++){
*(*(mySquare.array + i) + j) = 0;
}
}
/* Print out the 2D array */
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3l ; j++){
printf("%d ", *(*(mySquare.array + i) + j));
}
printf("\n");
}
/* I can see the complete 2D array here */
Square *sqrptr = &mySquare;
return sqrptr;
}
Я пытался генерировать Square
в main()
, а также использовать один указатель на структуру, чтобы получить доступ к моей 2D массив. Он отлично работает, поэтому, я думаю, я что-то пропустил, когда использовал указатель, возвращенный из других функций. С другой стороны, я могу получить доступ к int value
, так что теперь у меня нет подсказок.
Может кто-нибудь объяснить причину этой ошибки сегментации? Благодаря!
Square * generate(); не имеет смысла для моих глаз –
@SaeidYazdani Я только что объявил функцию до 'main()'. –
Вы возвращаете адрес локальной переменной. Эта переменная больше не существует, когда основная функция хочет ее использовать. – mch