赋值形式不兼容的指针类型
assignment form incompatible pointer type
我收到一条警告,指出从不兼容的指针类型赋值。
我是编程新手,尽了最大努力,但仍然无法弄清楚。
我收到以下错误:
20 6 D:\DS programs\practical 2\employees_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",&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",&(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",&(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;
}
您将 ptr
定义为 struct employee
:
的指针
struct employee
{
int no,salary;
char name[10],desig[10];
}*ptr;
然后你分配内存来保存n
这样的结构的动态数组:
ptr = (int*)calloc(n,sizeof(struct employee));
函数 calloc
和 malloc
return 指向 void 的指针,void *
。您将该指针明确地转换为指向 int
的指针。此赋值的右侧现在具有类型 int *
.
左侧需要 struct employee *
。就是你的指针不兼容。
c
/malloc
returns a void *
是有原因的:在C语言中,指向void的指针可以赋值给任何指针类型而无需强制转换。所以你不需要演员表。你的内存分配应该是:
ptr = calloc(n, sizeof(struct employee));
或者也许
ptr = calloc(n, sizeof(*ptr));
另一方面,C++ 需要显式转换,因此有些人无论如何都会进行转换以与 C++ 编译器兼容。如果这样做,则必须强制转换为正确的指针类型。 (显式转换使得 malloc
在 C++ 中非常冗长,但无论如何您通常会使用 new
。)
我收到一条警告,指出从不兼容的指针类型赋值。 我是编程新手,尽了最大努力,但仍然无法弄清楚。 我收到以下错误: 20 6 D:\DS programs\practical 2\employees_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",&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",&(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",&(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;
}
您将 ptr
定义为 struct employee
:
struct employee
{
int no,salary;
char name[10],desig[10];
}*ptr;
然后你分配内存来保存n
这样的结构的动态数组:
ptr = (int*)calloc(n,sizeof(struct employee));
函数 calloc
和 malloc
return 指向 void 的指针,void *
。您将该指针明确地转换为指向 int
的指针。此赋值的右侧现在具有类型 int *
.
左侧需要 struct employee *
。就是你的指针不兼容。
c
/malloc
returns a void *
是有原因的:在C语言中,指向void的指针可以赋值给任何指针类型而无需强制转换。所以你不需要演员表。你的内存分配应该是:
ptr = calloc(n, sizeof(struct employee));
或者也许
ptr = calloc(n, sizeof(*ptr));
另一方面,C++ 需要显式转换,因此有些人无论如何都会进行转换以与 C++ 编译器兼容。如果这样做,则必须强制转换为正确的指针类型。 (显式转换使得 malloc
在 C++ 中非常冗长,但无论如何您通常会使用 new
。)