2015-06-07 5 views
1

У меня есть функция, которая находит римские цифры чисел, переданных в массиве, и сохраняет их в массиве строк и возвращает массив строк в main(). Но когда я пытаюсь получить доступ к возвращаемому массиву строк в main(), код выходит из строя из-за ошибки сегментации. Может кто-нибудь объяснить мне, почему это происходит, и как я могу исправить свой код?Ошибка сегментации при возврате char ** из функции

Добавлены комментарии в код, где виден дефект сегментации и где он работает нормально. Большое спасибо за ваше время и помощь.

int find_lookup_index(int temp) 
{ 

    int j=0; 
    while(1) 
     { 
      if(temp>=lookup_int[j] && temp<lookup_int[j+1]) 
       break; 
      j++; 
     } 
    return j; 
} 

char** romanizer(int num_size, int* num) 
{ 

    int i,j,temp; 
    char result[num_size][20]; 


    for(i=0;i<num_size;i++) 
    { 
     strcpy(result[i],"\0"); 

     if(num[i]%1000 == 0) 
     { 
      strcpy(result[i],"M"); 
      continue; 
     } 

     j=find_lookup_index(num[i]); 

     temp=num[i]; 
     while(temp>0) 
     { 
      strcpy(result[i],strcat(result[i],lookup_char[j])); 
      temp = temp - lookup_int[j]; 
      j = find_lookup_index(temp); 
     }   

    } 

    **/* WORKS CORRECTLY HERE */** 
    for(i=0;i<num_size;i++) 
     printf("%s\n",result[i]); 
    return (char **)result; 
} 

int main() 
{ 

    int size,i; 
    char **result; 

    int arr[3] = {3,11,499}; 
    result = romanizer(3,arr); 

    **/* NOT WORKING - SEGMENTATION FAULT - WHY ? */** 
    for(i=0;i<3;i++) 
     printf("%s\n",result[i]); 

    return 0; 
} 
+1

Возможный дубликат [Можно ли получить доступ к локальной папке за пределами ее области?] (Http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its- scope) –

+2

Вы не только возвращаете локальный автоматический var-адрес, но и не тот тип, который вы производите. a 'char [n] [m]' does * not * выразить как 'char **' и что он не будет компилироваться без этого hard-cast, должен быть намеком на это. Пусть одновременно исправить обе проблемы одновременно. – WhozCraig

ответ

3

result определяется в стеке, и «свободный» "d из стека, когда romanizer закончена выполнения. Поэтому, когда ваш main пытается использовать его, он получает ошибку сегментации.

Решение состоит из malloc структуры данных (которая выделяет ее в куче, а не в стеке) и имеет вызывающего абонента free, когда она больше не нужна.

+0

Работа с использованием malloc в romanizer. Спасибо alot .. – himanshu0811

1

Внутри функции romanizer вы выделяете результат в стек, который автоматически освобождается для вас при возврате из вашей функции. Когда вы пытаетесь использовать его в основном, оно уже исчезло.

Вы должны либо выделить его в куче с помощью нового/Malloc, а затем удалить/освободить его в главном меню или передать его в main и передать в качестве параметра вместо возвращаемого значения.

+0

Спасибо .. malloc/бесплатно заставляет это работать – himanshu0811

+0

Отлично! , Рад, что мой ответ был полезен. –

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