2012-05-27 3 views
0

Я просто изучаю динамику памяти и делаю эксперимент, но все равно застреваю. уже искать некоторые вокруг, но не дали никакого результата.Ошибка сегментации При использовании Realloc более 3-х раз

Это мой простой код:

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

    typedef struct kata kata; 
    struct kata { 
     char string[256]; 
    }; 

void load(kata **data) 
{ 
     int len = 0; 

     while(len < 5) { 


      (*data) = (kata *) realloc ((*data), (len + 1) * sizeof(kata)); 
      printf("copy A - %d\n", len); 

      strcpy(data[len]->string, "A"); 
      len++; 
     } 
     getch(); 
} 

int main() {  
    kata *data = NULL; 

    load(&data); 

} 

и мой вопрос, почему это всегда ошибка сегментации (по 3), когда я его отладки?

спасибо за ваши советы

EDIT:

До сих пор не знаю, почему происходит ошибка, но я нашел решение только сейчас ..

просто изменить данные [Len ] -> string to (* data) [len] .string

Любая идея, почему мы называем данные [len] -> string, происходят некоторые случайные segfault?

+0

Относительно вопроса из вашего редактирования: 'data [len] -> string' и' (* data) [len] .string' - это две разные вещи. Первый эквивалент '(* (data [len])). String'. – jamesdlin

+0

Обратите внимание, что это обычное * не * поставить «(РЕШЕНО)» в названии вопроса здесь, если вы это поняли; вместо этого нажмите галочку рядом с ответом, который вам больше всего помог. – Ashe

+0

Хе-хе, извините .., хорошо, я уже проверил один;) –

ответ

1

data[len]->string должен быть (*data)[len]->string(*data)[len].string

+0

попробуйте ваш совет, все еще не работает, IDE говорит «Недопустимый аргумент типа '->'", thx anyway: D –

+0

Извините, должно быть '. 'not' -> '. Изменено это в ответе. –

+0

спасибо, чувак, точно так же, как и решение, я получил его несколько минут назад. –

0

Я не знаю, почему код не работает для вас. Я попробовал аналогичный пример, и он сработал.

int main(void) 
{ 
    int *ptr = NULL; 

    ptr=(int *) realloc(ptr, 1*sizeof(int)); cout<<"1"<<endl; 
    ptr=(int *) realloc(ptr, 2*sizeof(int)); cout<<"2"<<endl; 
    ptr=(int *) realloc(ptr, 3*sizeof(int)); cout<<"3"<<endl; 
    ptr=(int *) realloc(ptr, 4*sizeof(int)); cout<<"4"<<endl; 
    ptr=(int *) realloc(ptr, 5*sizeof(int)); cout<<"5"<<endl; 
    return 0; 
} 

Я попытался запустить ваш код. Это вызывает проблемы в строке strcpy. Если вы прокомментируете эту строку. Он работает нормально.

данные [len] -> строка вернет вам правильный ответ. Здесь вы malloced массив для * данных. Следовательно, правильный способ сделать это - strcpy ((* data) [len] .string, «A»). Обратите внимание на использование оператора точки вместо оператора стрелки на строку разыменования.

+0

о, да, в любом случае: D –

+0

вы можете принять ответы, которые очищают ваше понимание. :) –

0

Ну, я считаю, что должно быть нарушение доступа при использовании strcpy во второй итерации цикла while. Интересно, как это работает во второй раз и вызывает ошибку в 3-м. Я был бы более чем счастлив, если бы кто-нибудь мог объяснить это мне.