Получение предупреждения при попытке инициализации структуры "employee" - PullRequest
0 голосов
/ 27 декабря 2018

Получение следующего предупреждающего сообщения:

database.c:15:19: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
  ptr->LastName[0] = NULL;
                   ^
database.c:16:26: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
  ptr->FirstMiddleName[0] = NULL;

                      ^

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

#include <stdio.h>

int main() {
        struct employee {
                char LastName[30];
                char FirstMiddleName[35];
                float Salary;
                int YearHired;
        };

        struct employee employees[20];
        struct employee *ptr, person;
        ptr = &person;

        ptr->LastName[0] = NULL;
        ptr->FirstMiddleName[0] = NULL;
        ptr->Salary = -1;
        ptr->YearHired = -1;

        printf("%i", person.YearHired);
        printf("%s", person.LastName[0]);

        for(int i = 0; i < 20; i++) {
                employees[i] = person;
                //printf("%i\n", i);
        }

        printf("%c", employees[3].LastName[0]);
}

Я хотел бы инициализировать массив из 20 «сотрудников» с начальными значениями, чтобы числовые значения были установлены на -1, а строки содержали нулевой символ в качестве нулевого символа.Вместо этого я получаю вышеупомянутое предупреждение, и если я заменяю NULL-назначение буквой, на которой написано «Ошибка сегментации (ядро сброшено)».

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

Чтобы исправить предупреждение, замените NULL нулевым символом '\ 0'.NULL - это указатель, а не то, что вы хотите.

ptr->LastName[0] = '\0';

Чтобы исправить ошибку сегментации, замените person.LastName [0] на person.LastName в вашем printf. person.LastName [0] является одним символом.printf% s ожидает адрес строки с нулевым символом в конце.

printf("%s", person.LastName);

Этот оператор printf может все еще не работать, если вы не поместите нулевое завершение где-нибудь в вашей строке:

 ptr->LastName[0] = 'a';   //may still fail in printf without termination.

vs

ptr->LastName[0] = 'a';   
ptr->LastName[1] = '\0';  
0 голосов
/ 27 декабря 2018

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

    ptr->LastName[0] = 0;
    ptr->FirstMiddleName[0] = 0;

Это также недопустимо:

printf("%s", person.LastName[0]);

, поскольку person.LastName[0] - это один символ, а не строка.Вы вместо этого хотите:

printf("%s", person.LastName);
0 голосов
/ 27 декабря 2018

Предупреждающее сообщение компилятора достаточно ясно, чтобы понять, что вы делаете неправильно.Здесь

ptr->LastName[0]  = NULL; /* NULL is equivalent of (void*)0 not \0 */

LastName[0] означает character, а не символьный указатель .Вы можете хотеть

ptr->LastName[0]  = '\0'; /* now here \0 and Lastname[0] both are of char type */
0 голосов
/ 27 декабря 2018

Макрос NULL является недопустимым указателем, а не символом ASCII NUL, его не следует использовать в качестве символьной константы.NUL-символом является \0:

    ptr->LastName[0] = `\0` ;
    ptr->FirstMiddleName[0] = `\0` ;

Или также допустимо просто использовать буквальный ноль:

    ptr->LastName[0] = 0 ;
    ptr->FirstMiddleName[0] = 0 ;
0 голосов
/ 27 декабря 2018

NULL является константой нулевого указателя, а не нулевым символом.Использование:

ptr->LastName[0] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...