2015-10-24 3 views
1

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

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
void read(char **banda, int *s, int *sf, int **vs, char **vcs, char **vd) 
{ 
    FILE *fin; 
    int i; 
    fin = fopen("date.in", "r"); 
    *banda = (char*)malloc(50*sizeof(char)); 
    fgets(*banda, 50, fin); 
    fscanf(fin, "%d", s); 
    fscanf(fin, "%d", sf); 
    fseek(fin, 1, SEEK_CUR); 
    int l = 3* ((*s)-(*sf)); 
    *vcs = (char*) malloc(l * sizeof(char)); 
    *vd = (char*) malloc(l *sizeof(char)); 
    *vs = (int*) malloc(l * sizeof(int)); 
    for(i = 0; i< l ; i++) 
    { 
     fscanf(fin, "%d", vs[i]); 
     fscanf(fin, " %c", vcs[i]); 
     fscanf(fin, " %c", vd[i]); 
     fseek(fin, 1 , SEEK_CUR); 
    } 
    fclose(fin); 
} 

int main() 
{ 
    char *banda; 
    int i; 
    int s, sf; 
    char *vcs; 
    char *vd; 
    int *vs; 
    read(&banda, &s, &sf, &vs, &vcs, &vd); 
    for(i = 0; i < strlen(banda) ; i++) 
    { 
     printf("%c", banda[i]); 
    } 
    printf("%d %d\n", s, sf); 
    for(i = 0; i < 3*(s-sf) ; i++) 
    { 
     printf("%d %c %c\n", vs[i], vcs[i], vd[i]); 
    } 

} 

Example input: 
Helen 
2 1 
1 H A 
2 B C 
5 K I 

Однако я не могу выделить память для него. Если я пройду мимо i = 0 (как первая позиция в массивах), программа покажет мне опрятную «ошибку сегментации». Однако, если я только иду и пишу в массиве ONE значение для каждого, это не сбой. Там что-то я серьезно не хватает, и я просто не могу понять это.

+0

Вы выделяете 'vcs' как' символ * VCS; '(один указатель символов), но попробовать использовать его как 'char *' массив в 'read' (массив' char * ') –

ответ

1

Проблема здесь:

fscanf(fin, "%d", vs[i]); 
fscanf(fin, " %c", vcs[i]); 
fscanf(fin, " %c", vd[i]); 

Переменные vs, vcs и vd указатели на массивы. Здесь вы рассматриваете их как массивы указателей. Вы должны сначала разыменования указателя, а затем получить элемент массива, который вы хотите записать, а затем взять его адрес:

fscanf(fin, "%d", &(*vs)[i]); 
fscanf(fin, " %c", &(*vcs)[i]); 
fscanf(fin, " %c", &(*vd)[i]); 
+0

Нет необходимости делать это @dbush, просто разыгрывать раз и все будет нормально работать. 'fscanf (fin,"% d ", * vs);' Кстати, вы сделали то же самое, но немного сложнее понять/прочитать. – phyloflash

+0

Hi dbush. Пробовал свой вариант, теперь он действительно добавляет вторую позицию в массивы, но он терпит неудачу на третьей позиции (для моего примера) и seg-сбоях :( – Snappy

+0

Ничего. Я был braindead, извините, ваш ответ был прекрасен. много: D – Snappy

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