有人可以快速查看这个C代码,看看为什么我得到编译器错误?它是一个将详细信息输入日历结构的功能,应创建一个节点,即日历上的一个“事件”。
struct event enter_key(void)
{
int day,month,year,starttime,endtime,length;
char* descp;
struct event* n;
printf("Enter Day:\n");
scanf("%d", &day);
printf("Enter Month:\n");
scanf("%d", &month);
printf("Enter Year: \n");
scanf("%d", &year);
printf("Enter starttime:\n"); scanf("%d", &starttime);
printf("Enter endtime:\n");
scanf("%d", &endtime);
printf("Enter Description: \n");
scanf("%s", &descp);
n=mkevent(day, month, year, starttime, endtime, &descp);
尝试编译时收到此消息:
newpro.c:115:警告:传球 来自'mkevent'的论证6 不兼容的指针类型
有人能告诉我是否错误地声明指针,或者是否应该为'descp'指针分配空间,还是我试图以错误的方式在结构中创建节点?
感谢阅读, C新手。
答案 0 :(得分:2)
指针应指向一个足够大的缓冲区,以便用户在scanf
调用中输入的值。
%s Matches a sequence of non-white-space characters;
the next pointer must be a pointer to char, and the
array must be large enough to accept all the
sequence and the terminating NUL character. The
input string stops at white space or at the maximum
field width, whichever occurs first.
所以它可能像
char descp[ MAX_DESCRIPT ];
scanf("%s", descp);
虽然在实际代码中,您应该使用其中一种技术来读取字符串,但不会导致缓冲区溢出(以及可能的用户要求输入包含空格的描述)。
我是否试图以错误的方式在结构中创建节点?
我不知道mkevent的签名,但是我希望它将指针作为描述带到字符串缓冲区(const char*
),而不是指向字符串的指针(传入descp
而不是&descp
)。
答案 1 :(得分:1)
descp是类型'指向char的指针'(char *)。在违规行中,您传递指针本身的地址(char **)。删除'&'在论证面前。
哦,不要在生产代码中使用scanf(),尤其是读取字符串。它不会进行任何边界检查,可能会导致缓冲区溢出。
答案 2 :(得分:0)
该消息告诉您mkevent
需要一个不同类型的参数(在& descp的位置)。
你应该再次检查mkevent()需要什么。它不是char **。
也许你应该在mkevent的行中改变& descp到descp - 只是猜测。
答案 3 :(得分:0)
你没有显示mkevent的声明,但我猜你想传递desc
,而不是它的地址。你有:
n=mkevent(day, month, year, starttime, endtime, &descp);
你可能想要:
n=mkevent(day, month, year, starttime, endtime, descp);
答案 4 :(得分:0)
给我们mkevent()的声明会有所帮助,但这很可能是因为你应该传递descp时传递& descp。