2013-10-03 2 views
0

Мне было интересно, какая функция мне понадобится, чтобы скопировать данные указателя typedef struct в массив typedef struct.Программа отлично работает с VS2012, но встречается Ошибка при использовании Tiny C

typedef struct nodebase{ 
    char company[254]; 
    int counter; 
    int rows; 
    int column; 
    struct nodebase *next; 
}data; 

Я знаю, что я мог бы использовать memcpy для char company, но как насчет для значений Integer?

Я хочу сделать что-то вроде:

int main() 
{ 
data *p; 
data item[] = {0}; 
int counter = 0; 

/*Calling for the roster file to scan and store the data into `data *p` using fscanf*/ 
/*Code for singly linked-list*/ 
counter++ //This happens everytime the program has scanned 4 variables in the file 
item[counter] = p; //This definitely is now working.. 

Отредактировано: Я теперь с помощью memcpy и предыдущая проблема была решена.

(Спасибо за ваши ответы!)

Теперь я сталкиваясь с новой проблемой, и что в моем односвязном-списке.

По-видимому, в файле реестра имеется 12 «счетчик» (это значит, что в файле реестра есть 48 переменных для чтения и хранения данных).

//Code for Singly Linked-list 
int main() 
{ 
data *p; 
data *head; 
data *tail; 
data item[] = {0}; 
FILE *f; 
int counter = 0; 

head = NULL; 
tail = NULL; 

while(!feoe(f) 
{ 
    p = malloc(sizeof(data)); 
/*Opens the roster file and Read & Store the data in the file to the respective variables inthe `typedef struct`.*/ 
    if(head ==NULL) 
    { 
     head = p; 
    } 
    else 
    { 
     tail->next = p; 
    } 
    tail = p; 

    if(head!=NULL) 
    { 
     do{ 
      printf(":||%s||: Name",p->name); //Just to check if the linked list is working 
      memcpy(&item[counter], p, sizeof(data*)); 
      counter++; 
      p = p->next; 
      p = NULL; 
     }while(p!=NULL); 
    }free(p); 
} 
} 

Проблема: При печати каждых имен 12 «наборов» из файла реестра, программа выводит первые 10 комплектов правильно, то он вдруг перестает работать. (С использованием Tiny C в Windows)

И, что самое главное, когда я компилирую этот файл с VS2012, он отлично работает.

+0

Этот код не имеет смысла. У вас есть массив без размера? У вас есть указатель, который указывает на отсутствие памяти, и вы пытаетесь записать массив из своих границ. Он даже компилирует? –

+0

@TonyTheLion По-видимому, он может быть скомпилирован с использованием VS2012. Можете ли вы сказать мне, есть ли способ использовать массив, размер которого еще не назначен? –

ответ

0

Если вы хотите, чтобы скопировать содержимое, на который указывает struct nodebase * (ака data *) в struct nodebase [] (data []), вы действительно можете использовать memcpy:

memcpy(&item[counter], p, sizeof(struct nodebase)); 

Как указано в документации memcpy:

Основной тип объектов, указываемого как указатели источника и назначения не имеют значения для этой функции; Результатом является двоичная копия данных.

Не имеет значения, целые ли они или что-то еще.

Однако вам понадобится достаточно большой массив. поэтому не забудьте создать экземпляр массива item с достаточно большим размером.

+0

Мой 'counter' будет добавлять 1 каждый раз, когда 5 переменных были прочитаны и сохранены в файле. Нужно ли использовать realloc? –

+0

Лучше, если у вас есть достаточно большой массив от начала, так как 'realloc' займет много ресурсов. Если вы не знаете размер массива, лучше использовать цепочный список. – Shaac

0

Попробуйте

memcpy(&item[counter], p, sizeof(data)); 

ваше вышеуказанное заявление недействительно

item[counter] = p; 

Посмотрите на типы