Ошибка работы со структурами и массивами указателей: несовместимые типы в присваивании - PullRequest
0 голосов
/ 02 февраля 2010
#define STRMAX 50

struct Person {
    char sName[STRMAX];
    int iAge;
};
typedef struct Person PERSON;

int main() {
    PERSON *personen[1];
    personen[0]->sName = "Pieter";
    personen[0]->iAge = 18;

    return 0;
}

Этот код генерирует ошибку на personen[0]->sName = "Pieter";, говоря несовместимые типы в присваивании .Почему?

Ответы [ 4 ]

2 голосов
/ 02 февраля 2010

Вам не нужен массив указателей. Попробуйте
PERSON personen[1];

И, как говорили другие, используйте функцию strcpy!

1 голос
/ 02 февраля 2010

Изменение

PERSON *personen[1];

до

PERSON personen[1];

и используйте strcpy для копирования строки.

strcpy(personen[0]->sName,"Pieter");
1 голос
/ 02 февраля 2010

Не пытайтесь назначать массивы.Используйте strcpy для копирования строки из одного массива в другой.

... sName - это массив символов, а "Pieter" - это const char*.Вы не можете назначить последнее на первое.Компилятор всегда прав:)

0 голосов
/ 02 февраля 2010

Я согласен с вышеизложенным, но я решил, что также важно включить «почему»

int a;      // is an integer
int *b;     // pointer to an integer must be malloced (to have an array)
int c[];    // pointer to an integer must also be malloced (to have an array)
int d[5];   // pointer to an integer bu now it is initialized to an array of integers

чтобы получить b и c из простых указателей и дать им память для соответствия d используйте следующее, чтобы дать им пространство памяти

b = (int *) malloc(sizeof(int)*5);

, где он преобразует указатель, возвращенный из malloc, в указатель int и создает блок памяти, в 5 раз превышающий целое число (таким образом он будет содержать 5 целых чисел, таких как d)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...