2014-12-09 2 views
-4

У меня проблема с моим кодом, я не могу назначить строковое значение в char * в структуре. Может кто-нибудь сказать мне, что не так с моим кодом и почему?Назначение значения char * в структуре

#include <iostream> 
using namespace std; 

typedef struct{ 
char* name; 
char* city; 
int age; 
} person; 
void main() 
{ 
person * user; 
user = (person*)malloc(sizeof(person*)); 

cout << "Please fill in the user info.." << endl << "Name: "; 
cin >> user->name; 
cout << "Age: "; 
cin >> user->age; 
cout << "City"; 
cin >> user->city; 

cout << "The user info is:" << endl << "Name: " << user->name << endl << "Age: " << user->age << endl << "City: " << user->city << endl; 
system("pause"); 
} 

Большое спасибо.

+11

Выберите язык. Если это C, не используйте 'cin' и выделяйте некоторую память для строк. Если это C++, используйте 'std :: string' и не используйте' malloc' или raw указатели. Если это ужасная смесь обоих, то просто сдавайся сейчас. –

+1

Просьба пояснить, что вы подразумеваете под «невозможно присвоить строковое значение». В этом коде есть только одно задание, которое является 'user = ...'. (И не используйте 'malloc' в C++, используйте' new'.) – molbdnilo

+1

попробуйте изменить «user = (person *) malloc (sizeof (person *));» to "user = (person *) malloc (sizeof (person));" – pmverma

ответ

0
malloc(sizeof(person)); 

Это создаст память для хранения 2 символов char * и 1 int.

Вам также необходимо выделить память для char * s в структуре, которую вы пропустили.

+0

причина для downvote пожалуйста ... – ravi

+1

Ваш оригинальный ответ был неправильным, 'malloc (sizeof (person *))' не выделяет пространство для двух указателей и int. Ваш отредактированный ответ более точен, но это не то, что делает код OP. –

0

Я не знаю, о c++, но если вы решили придерживаться c, ваш user->name не распределяемой памяти, ни user->city. Вы должны использовать malloc() с соответствующим размером, чтобы выделить память переменной указателя, а затем использовать те, чтобы сохранить значения.

Кроме того,

user = (person*)malloc(sizeof(person*)); 

должен быть

user = malloc(sizeof(*user)); 

Затем void main() должен быть изменен на int main() и нужно добавить return 0. Лучше всего отправить статус выхода в оболочку.


Примечание: видя использование

#include <iostream> 
using namespace std; 

это выглядит больше c++ вещь, но ИМО, логика должна быть такой же.

+0

еще раз, пожалуйста, дайте мне знать причину downvote ...... –

+2

Кастинг должен _not_ требуется в большинстве правильно написанных C++ –

+0

@JonathanWakely ok sir, обновлено. просмотрите сейчас. спасибо за вход, я уже упоминал, я мало знаю о 'C++'. –

3

Ваш код - это ужасное сочетание стиля C и C++, как говорится в комментарии Майка, выберите язык и используйте его правильно.

#include <iostream> 
#include <string> 
using namespace std; 

struct person { 
    string name; 
    string city; 
    int age; 
}; 

int main() 
{ 
    person user; 

    cout << "Please fill in the user info.." << endl << "Name: "; 
    cin >> user.name; 
    cout << "Age: "; 
    cin >> user.age; 
    cout << "City"; 
    cin >> user.city; 

    cout << "The user info is:\n" << "Name: " << user.name << "\nAge: " << user.age << "\nCity: " << user.city << endl; 
    system("pause"); 
} 

Не динамически выделять, когда вам не нужен (то нет никакого риска mallocing неправильного количества памяти, и никакого риска не mallocing памяти для строк, которые обе ошибки, которые вы сделали в ваша оригинальная программа).

main должен вернуть int не void

typedef struct {...} x; не является необходимым в C++, просто сказать struct x {...};

Don't overuse endl

2

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

Если это предназначается, чтобы быть C++, а затем использовать стандартную библиотеку:

#include <string> 
#include <iostream> 

struct person { 
    std::string name; 
    std::string city; 
    int age; 
}; 

int main() { // not void 
    person user; 
    // ... 
    std::cin >> user.name; 
    // ... 
} 

Если это означало быть C, то вам нужно выделить память для строк.Либо выделить их из кучи:

person user; 
user.name = malloc(MAX_NAME_SIZE); 
user.city = malloc(MAX_CITY_SIZE); 

или вставлять их в структуру:

typedef struct { 
    char name[MAX_NAME_SIZE]; 
    char city[MAX_NAME_SIZE]; 
    int name; 
} person; 

и заботиться, чтобы не переполнить эти буферы фиксированного размера, когда вы читаете от входа.

Если вы действительно хотите использовать malloc для самой структуры какой-либо причине, то выделить достаточно для структуры, а не просто указатель:

user = malloc(sizeof(person)); 
Смежные вопросы