2014-11-05 3 views
0

Я программирования на C, и есть два файла, func2.h:C - ошибка сегментации при доступе указателя в файле заголовка

#define NN 20 

void network_construction(int **veins, int *num_veins){ 

     int i, j; 


     for(i=0;i<NN;i++){ 
      num_veins[i] = NN/2; 
     } 


     veins = malloc(NN * sizeof(*veins)); 
     for (i = 0; i < NN; i++) { veins[i] = malloc(num_veins[i] * sizeof(*(veins[i]))); } 
     for (i = 0; i < NN; i++) { for (j = 0; j<num_veins[i];j++) { veins[i][j] = -1; } } 


    return; 
    } 

и main.c:

#include <stdio.h> 
#include <stdlib.h> 
#include "func2.h" 

void main(){ 

    int num_veins[NN]; 
    int **veins; 


    network_construction(veins, num_veins); 

    printf("\n%d\n", num_veins[19]); 
    printf("\n%d\n", veins[2][2]); 

return; 
} 

num_veins [] дает правильный номер 10, но при попытке доступа к любым элементам вен они дают ошибку сегментации. Как я могу использовать в main.c значения вены, которые заполнены func2.h? Что я делаю неправильно и почему это происходит?

EDIT:

Эти коды представляют собой упрощенную версию более крупные. В ответах есть способ решить проблему, но это не совсем то, что я хочу. Мне нужно сделать динамическое распределение в func2.h, поэтому я не хочу никаких вычислений с участием вен [] [] в main.c перед вызовом network_construction().

+3

вы можете начать с определения функции в файле '.c'. –

+0

.. и возможный дубликат [this] (http: // stackoverflow.com/q/8543808/2173917) –

+0

Итак, @SouravGhosh, я делаю это, а потом что? – oriol

ответ

0

Код ниже добивается того, чего я хотел:

void network_construction(int ***veins, int num_veins[]){ 
    int i,j; 

    for(i=0;i<NN;i++){ 
    num_veins[i] = NN/2; 
    } 

    (*veins) = malloc((NN) * sizeof(**veins)); 

    for(i=0;i<NN;i++){ 
    (*veins)[i] = malloc(num_veins[i]*sizeof(*(*veins)[i])); 
    } 

    for (i = 0; i < NN; i++) { 
    for (j = 0; j < num_veins[i]; j++) { 
     (*veins)[i][j] = -1; 
    } 
    } 
    return;} 

Для вызова в основной():

network_construction(&veins,num_veins); 
0

veins = malloc(NN * sizeof(*veins)); есть ваша проблема. Вам действительно нужен int***, чтобы сделать то, что вы хотите. Внутри network_construction аргумент вены на самом деле является копией переменной veins в вашем main. Поэтому, когда вы malloc его, изменяется только копия, но не основная переменная.

Более простой пример той же задачи будет следующим образом:

void foo(int a){ 
    a=5; 
} 
void foo2(int* a){ 
    *a=5; 
} 
int main(){ 
    int a=0; 
    foo(a); 
    printf("%d\n",a); 
    foo2(&a); 
    printf("%d\n",a); 
} 

который печатает 05. Ваш случай то же самое, но вместо int и int*, думать о int** и int***

+0

Я ценю вашу помощь, @Cantfindname, но с информацией, которую вы мне даете, я еще не смог решить проблему. Я отредактировал вопрос, чтобы уточнить, что я хочу. Не могли бы вы взглянуть на это, а также на другие комментарии/ответы и посмотреть, есть ли у вас идея решить проблему? Спасибо ! – oriol

0

Ваш вызов функции должен выглядеть следующим образом:

network_construction (& вены, num_veins);

Тогда в улове вены функции network_construction следующим образом:

void network_construction(int ***veins, int *num_veins){ 

     int i, j; 


     for(i=0;i<NN;i++){ 
      num_veins[i] = NN/2; 
     } 


     *veins = malloc(NN * sizeof(**veins)); 
     for (i = 0; i < NN; i++) { *veins[i] = malloc(num_veins[i] * sizeof(**(veins[i]))); } 
     for (i = 0; i < NN; i++) { for (j = 0; j<num_veins[i];j++) { *veins[i][j] = -1; } } 


    return; 
    } 
+0

Спасибо @ rajasekar25. Используя ваше предложение, оно дает ошибку «func2.h: 15: 76: warning: присваивание делает указатель из целого без cast [включен по умолчанию]». Строка 15 - это то, где я присваиваю значение -1 моим венам [i] [j] элементам. Что мне делать ? – oriol

+0

вы должны использовать его как «* veins [i] [j]». Кроме того, если все вены происходят, вам нужно добавить один * (разыменование) до этого. – rajasekar25

+0

Еще раз спасибо, теперь используя * veins [i] [j] программа компилируется, но при запуске она дает ошибку сегментации. Я новичок в использовании указателей, поэтому я не уверен, что означает «добавить один * (переизбыток)». Должен ли я включать * перед каждым венами? Потому что я пробовал это, и он все еще дает ошибку с ошибкой сегментации. – oriol

0

Ваш таНос в network_construction() функция является проблемой. Легко для того чтобы преодолеть эту вещь, чтобы изменить свои функции следующим образом:

Ваш func.c должен выглядеть следующим образом:

#define NN 20 

    void network_construction(int **veins, int *num_veins){ 

      int i, j; 

      for (i = 0; i < NN; i++) { for (j = 0; j<num_veins[i];j++) { veins[i][j] = -1; } } 


     return; 
     } 

Ваша главная функция будет выглядеть следующим образом:

#include <stdio.h> 
#include <stdlib.h> 
#include "func2.h" 

void main(){ 

    int num_veins[NN]; 
    int **veins; 
int i; 


     for(i=0;i<NN;i++){ 
      num_veins[i] = NN/2; 
     } 


     veins = malloc(NN * sizeof(*veins)); 
     for (i = 0; i < NN; i++) { veins[i] = malloc(num_veins[i] * sizeof(*(veins[i]))); } 

    network_construction(veins, num_veins); 

    printf("\n%d\n", num_veins[19]); 
    printf("\n%d\n", veins[2][2]); 

return; 
} 
+0

спасибо, это действительно решает проблему. На самом деле я уже думал об этом. Однако эти опубликованные коды являются упрощенными версиями более крупного. В func2.h я делаю больше вещей, чтобы получить num_veins [i], которые не являются постоянными. Поэтому мне очень хотелось бы иметь все вычисления вместе в func2.h и использовать прямые вены [] [] в main.c, без ненужных вычислений с участием вен [] [] перед вызовом network_construction(). Любая идея в том, как с этим бороться? – oriol

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