форма присвоения несовместимого типа указателя

#c #pointers #structure

#c #указатели #структура

Вопрос:

Я получаю предупреждение о присвоении несовместимого типа указателя. Я новичок в программировании и старался изо всех сил, но все еще не мог понять это. Я получаю следующую ошибку: 20 6 D:DS programspractical 2employees_structure_pointer.c [Предупреждение] присвоение из несовместимого типа указателя

 /* Accept n employee details using structure and pointer and display their details. */

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

struct employee
{
    int no,salary;
    char name[10],desig[10];
}*ptr;

int main()
{
    int i,n;
    printf("Enter total number of employees: ");
    scanf("%d",amp;n);
    
    ptr = (int*)calloc(n,sizeof(struct employee));
    printf("nEnter employee details: n");
    for(i=0;i<n;i  )
    {
        printf("Enter employee number: ");
        scanf("%d",amp;(ptr i)->no);
        printf("Enter name of the employee: ");
        scanf("%s",(ptr i)->name);
        printf("Enter designation of the employee: ");
        scanf("%s",(ptr i)->desig);
        printf("Enter salary of the employee: ");
        scanf("%d",amp;(ptr i)->salary);
        printf("n");
    }
    
    printf("Employee details are: n");
    for(i=0;i<n;i  )
    {
        printf("nEmployee number is: %d",(ptr i)->no);
        printf("nEmployee name is: %s",(ptr i)->name);
        printf("nEmployee designation is: %s",(ptr i)->desig);
        printf("nEmployee salary is: %d",(ptr i)->salary);
    }
    return 0;
}
 

Комментарии:

1. ptr является указателем на a struct employee , но вы явно приводите возвращаемое значение malloc to (int *) , которое является типом указателя, несовместимым с (struct employee *) . Здесь вам не нужно приведение; malloc возвращает a void * , которое является совместимым присвоением. Итак: ptr = malloc(...);

2. @MOehm Пожалуйста, сделайте это ответом, он идеален.

Ответ №1:

Вы определяете ptr как указатель на struct employee :

 struct employee
{
    int no,salary;
    char name[10],desig[10];
}*ptr;
 

Затем вы выделяете память для хранения динамического массива n таких структур:

 ptr = (int*)calloc(n,sizeof(struct employee));
 

Функции calloc и malloc возвращают указатель на void, void * . Вы явно приводите этот указатель к указателю на int . Правая часть этого присвоения теперь имеет тип int * .

Левая сторона ожидает a struct employee * . В этом заключается ваша несовместимость указателей.

Существует причина c , по которой / malloc возвращает a void * : в C указатель на void может быть назначен любому типу указателя без приведения. Так что вам не нужно приведение. Ваше распределение памяти должно быть просто:

 ptr = calloc(n, sizeof(struct employee));
 

или, возможно

 ptr = calloc(n, sizeof(*ptr));
 

С другой стороны, C требует явного приведения, поэтому некоторые люди все равно приводят, чтобы быть совместимыми с компиляторами C . Если вы это сделаете, вы должны привести к правильному типу указателя. (Явное приведение malloc в C довольно подробное, но вы все равно обычно используете new вместо этого.)