#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
является указателем на astruct employee
, но вы явно приводите возвращаемое значениеmalloc
to(int *)
, которое является типом указателя, несовместимым с(struct employee *)
. Здесь вам не нужно приведение;malloc
возвращает avoid *
, которое является совместимым присвоением. Итак: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
вместо этого.)