2015-08-29 3 views
2

Я пытаюсь выделить память в матрицу в функции и затем распечатать ее значения.Проблемы с распределением памяти для матрицы в c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void cria_ilhas(int** ilhas, int n){ 
    int i, p; 
    ilhas = (int**) malloc(n*sizeof(int*)); 
    for (i=0;i<n;i++){ 
     ilhas[i] = (int*) malloc(n*sizeof(int)); 
     for (p=0; p<n; p++) 
      ilhas[i][p] = 4; 
    } 
    printf("value %d\n",ilhas[0][0]); 
} 

void main(){ 
    int n=5, i, j; 
    int **ilhas; 
    cria_ilhas(ilhas, n); 
    for(i=0; i<n; i++){ 
     for(j=0;j<n;j++){ 
      printf("%d ",ilhas[i][j]); 
     } 
     printf("\n"); 
    } 
} 

Но это выход:

value 4 
Segmentation fault 

Почему у меня возникают ошибки сегментации?

Как использовать memset в этом виде матрицы?

+1

Это не матрица, а массив указателя на (массив) int. Обратите внимание, что вы не должны указывать результат «malloc' & friends. C не C++! – Olaf

+2

Игла в функции не совпадает с символом 'ilhas' в' main'. Поместите 'printf («% p \ n », ilhas)' в конце функции и перед/после вызова функции в 'main'. – user3386109

+0

Ну, я думаю, что в основном все матрицы представляют собой массив указателей на массивы типов значений. – 648trindade

ответ

2

Вы делаете это почти правильно. Когда вы вызываете cria_ilhas, вы передаете переменную ilhas и ожидаете, что, когда вы измените ее внутри функции, это также влияет на переменную в main. К сожалению, C не работает.

Что вы хотите сделать, это удалить параметр ilhas из cria_ilhas и остановки передачи его в том, когда вы вызываете его в main. Затем просто объявите ilhas в качестве локальной переменной в cria_ilhas. Чтобы вернуть значение к основному, вам нужно вернуть его с cria_ilhas, а в main, когда вы его вызываете, присвойте ilhas его результат.

Side Примечание: если вы используете C++, вы могли бы сделать его работу путем изменения параметра от int **ilhas к int **&ilhas.

3

Изменить код для этой формы, и скажите мне, если он работал

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int** cria_ilhas(int n){ 
    int i, p; 
    int **ilhas 
    ilhas = (int**) malloc(n*sizeof(int*)); 
     for (i=0;i<n;i++){ 
      ilhas[i] = (int*) malloc(n*sizeof(int)); 
      for (p=0; p<n; p++) 
       ilhas[i][p] = 4; 
     } 
    printf("value %d\n",ilhas[0][0]); 
    return ilhas; 
} 
void main(){ 
    int n=5, i, j; 
    int **ilhas; 
    ilhas = cria_ilhas(n); 
    for(i=0; i<n; i++){ 
     for(j=0;j<n;j++){ 
      printf("%d ",ilhas[i][j]); 
     } 
     printf("\n"); 
    } 
} 

Я думаю, что это должно работать для вас, ваш код намного вероятно, чтобы быть правдой, но проблема вы определили большую структуру в heap (определение ilhas в основном методе), и вы отправили его адрес методу (вызов по ссылке), который предполагает выделить для него память из сегмента стека, но не кучу, если вы передадите адрес простой переменной типа методу, это проблема была решена, но выделение памяти для массива вызовет проблему сегментации.

+0

Похоже, мне сегодня не повезло! – Zich

+0

Итак, когда я делаю 'ilhas = (int **) malloc (n * sizeof (int *));' Я изменяю указатель в функции, но не возвращаю его в 'main', правильно? Итак, если я выделяю массив указателей в 'main', а затем изменяя содержимое в функции, он будет работать? – 648trindade

+0

В приведенном выше коде я определил два метода ilhas внутри метода, а другой - тот, который был в основном методе, который у вас был раньше, я просто пытаюсь определить и распределить переменную ilhas одним методом, если вы сделаете это в cria_ilhas будет определяться в сегменте стека, но если вы определите его в основном, он перейдет в кучу из сегмента кода, я написал, что говорит icktoofay, мы оба упоминали одно и то же решение. Удачи с этим – Zich

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