2014-02-21 4 views
0

У меня возникли проблемы с назначением информации при использовании указателя.Передача и назначение указателя в C

Я не могу назначить какие-либо значения в функции readName. и можете ли вы проверить, правильно ли я построил структуру? OR Есть ли другой способ сделать это, не изменяя пораженный и параметр функции?

typedef struct name 
{ 
    char info[]; 
    int number; 
    //some more codes 
} name; 

typedef struct Data 
{ 
    name ** n; 
    //some more codes 
} Data; 


int readName(FILE *const fp, name **const names) 
{ 
    (*names)->number = 1; // no idea what to put here to store 
    strcat ((*names)->info, "aBC"); 
    //codes 
} 

int read(FILE *const fp, Data *const data) 
{ 
    data->n = malloc(sizeof(name*)*1); // am I mallocing correctly? 
    data->n[0]=malloc(sizeof(name)); 
    i = readName(fp, &data->n[Data->n]); 
    //codes 
} 

int main() 
{ 
    Data * d; 
    d = malloc (sizeof (Data)); 
    i = read(fp, d); //assume fp is decleared 
    //codes that usses the struct 
} 
+3

Вы должны объявить размер для 'Информация []'. – Barmar

+1

'strcat()' on 'info' без видимой' \ 0' инициализации 'info'. – chux

+0

«двойной указатель» может означать указатель на «double» или указатель на указатель на что-то. По соглашению обычно понимается первый. Если это не то, что вы намеревались, отредактируйте свой вопрос, чтобы перефразировать. – keshlam

ответ

0
data->n = malloc(sizeof(name*)*1); // am I mallocing correctly? 
    data->n[0]=malloc(sizeof(name)); 

вы только выделенное пространство для 1 указателя data->n = malloc(sizeof(name*)*1); поэтому у вас есть указатель на имя структуры.

i = readName(fp, &data->n[filep->ncards]); 

но вы выше, вы можете сделать только &data->n[0] вы не можете сделать &data->[1] или более высокие индексы. если вы хотите больше, чем 1 указатель на указатель на имя, вы должны выделить место для указателя, а затем сделать указатель точкой в ​​некоторой допустимой памяти.

попробовать этот

data->n = malloc((struct name*)how many pointers you want); 
for(int i =0;i<how many pointers you want;i++) 
data->n[i] = malloc(sizeof(struct name)); 

от вас кода, поскольку его не полностью, я думаю, что ncards = сколько указателей вы хотите.

int readName(FILE *const fp, name **const names) 
try 
int readName(FILE *const fp, name ** names) 

вы не сможете изменить данные через сопзЬ ** указатель, удалите сопзЬ и попробуйте еще раз

+0

Да, я редактировал ncards для Data-> n, так как это число указателей, в которых я нуждаюсь. Мне выделен 1 указатель, потому что мне нужен был только один прямо сейчас, и я планировал перераспределить его позже. Можете ли вы показать мне, что мне нужно в функции 'readName'? (* names) -> number = 1; // это не работает для меня – user3335341

+0

@ user3335341 не уверен, что именно ваши намерения находятся в функции имени чтения, если вы предоставляете образец кода, который компилируется, возможно, я могу посмотреть и проверить ошибки. – tesseract

+0

@ user3335341 измените имя ** const имена на имя ** имена, это может быть проблемой. – tesseract

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