2014-01-22 3 views
0

Я не уверен, где я ошибся со следующей структурой в C. Можете ли вы, ребята, дать мне знать, Что я делаю неправильно и что будет лучшим подходом.Простая структура в C - нужна помощь

#include<stdio.h> 
#include<string.h> 
typedef struct 
{ 
char *name; 
float gpa; 
int courseNo; 
} STUDENT; 

void createStudent(STUDENT s, char *n, float gpa, int course); 

int main(void) 
{ 
struct STUDENT s; 
createStudent(s, "Dummy", 3.8f, 203); 
printf("Name = %s\n", s.name); 
printf("GPA = %3.1f\n", s.gpa); 
printf("Course No. = %d\n", s.courseNo); 
return 0; 
} 

void createStudent(STUDENT s, char *n, float gpa, int course) 
{ 
    strcpy(s.name, n); 
    s.gpa = gpa; 
    s.courseNo = course; 
} 
+1

'createStudent()' только получает локальную копию, используйте 'СТУДЕНТА * s' с' -> 'вместо '.'. – Jori

ответ

1

Попробуйте вместо этого:

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


typedef struct 
{ 
    char *name; 
    float gpa; 
    int courseNo; 
} STUDENT; 

void createStudent(STUDENT* s, char *n, float gpa, int course); 

int main(void) 
{ 
    STUDENT s; 
    createStudent(&s, "Dummy", 3.8f, 203); 
    printf("Name = %s\n", s.name); 
    printf("GPA = %3.1f\n", s.gpa); 
    printf("Course No. = %d\n", s.courseNo); 
    return 0; 
} 

void createStudent(STUDENT* s, char *n, float gpa, int course) 
{ 
    s->name = malloc((strlen(n)+1) * sizeof(char)); 
    strcpy(s->name, n); 
    s->gpa = gpa; 
    s->courseNo = course; 
} 
+0

теперь он говорит: 's' в функции должен иметь изменяемое значение. Как это разрешить? – anansharm

+0

Я исправил ошибку с точкой с запятой. Это компилирует и дает правильные результаты для меня. Что такое ваш компилятор? – merlin2011

+0

Теперь я вижу, что вы говорите. Это сработало!! Тем не менее, под знаком «=» есть одно красное подчеркивание. он говорит: «Ошибка, значение типа (void *) не может быть присвоено значению типа (char *), но оно работает. – anansharm

4

Вы пропускание STUDENT объекта по значению, а не по ссылке, поэтому любые изменения, внесенные в него в вашей createStudent функции не влияют s. Вместо этого передайте указатель.

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

Как отметил @simonc, в вашем коде есть еще одна проблема. Когда вы вызываете strcpy в свою функцию, указатель, который вы пишете (s.name), является унифицированным, что означает, что когда вы назначаете его данные через strcpy, вы переписываете случайную память, которая просто запрашивает проблемы. Перед записью вам следует выделить память malloc.

Вот завершенный код:

void createStudent(STUDENT *s, char *n, float gpa, int course) 
{ 
    s->name = malloc(strlen(n) + 1); // +1 for null terminator 
    strcpy(s->name, n); 
    s->gpa = gpa; 
    s->courseNo = course; 
} 

А потом называют это так:

createStudent (&s, other args ...) 

Обратите внимание, что вы должны освободить память, когда вы сделали так:

free(s.name); 

, но только если вы больше не планируете использовать объект.

+0

's' в строке, он говорит, что это должно быть изменяемое значение s-> name = malloc (strlen (n + 1)); – anansharm

+0

когда я пытаюсь скомпилировать, я получаю эту ошибку в строке malloc ... ошибка C2106: '=': левый операнд должен быть l-значением. Как это решить? – anansharm

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