在 C 中编译“不兼容的指针类型”

问题描述 投票:0回答:2

我的代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void getData(short int *number, char *string)
{
    printf("\nPlease enter a number greater than zero: ");
    scanf("%hd", number);

    printf("Please enter a character string: ");
    scanf("%s", string);
}

void echoPair(short int *number, char *string)
{
    printf("Number: %hd Character(s): %s\n", *number, string); 
}

int main()
{
    short int *number = 0;
    char string[32] = {0};

    printf("This program will ask you to enter a number greater than zero and \na character string with less than 32 characters \ninput.");

    getData(&number, &string);
    echoPair(&number, &string);
    return(0);
}

代码工作正常,但我收到这些编译器警告

warning: passing argument 1 of ‘getData’ from incompatible pointer type
warning: passing argument 2 of ‘getData’ from incompatible pointer type
warning: passing argument 1 of ‘echoPair’ from incompatible pointer type
warning: passing argument 2 of ‘echoPair’ from incompatible pointer type

如果这样做

    getData(number, string);
    echoPair(number, string);

警告消失,但在我在 getData 函数中输入第一个数字后,程序收到“分段错误:11”。

有人知道如何删除警告并保持程序正常运行吗?

谢谢

c pointers character compiler-warnings short
2个回答
5
投票

这里存在很多问题。


首先,线路:

short int *number = 0;

应该是:

short int number = 0;

因为您使用了前者,所以它给了您一个指向

short
的空指针。这不是你想要的,因为第一次取消引用该野兽可能会使你的代码崩溃(或者更糟糕的是,不会使你的代码崩溃但会导致奇怪的行为)。

其次,你不需要传入字符串的地址,它们会自动衰减到一个地址,所以改变:

getData (&number, &string); echoPair (&number, &string);

至:

getData (&number, string); echoPair (&number, string); // but see last point below.


最后,您不需要传入
address

来打印它,您只需传入值即可,因此: echoPair (&number, &string);

变成:

echoPair (number, string);


总的来说,我认为你想要的是:

#include <stdio.h> #include <stdlib.h> #include <ctype.h> void getData(short int *number, char *string) { printf("\nPlease enter a number greater than zero: "); scanf("%hd", number); printf("Please enter a character string: "); scanf("%s", string); } void echoPair(short int number, char *string) { printf("Number: %hd Character(s): %s\n", number, string); } int main (void) { short int number = 0; char string[32] = {0}; printf("Blah blah ..."); getData(&number, string); echoPair(number, string); return(0); }


顺便说一句,您
永远

不想看到无限制的字符串扫描,例如: scanf ("%s", string);

在生产就绪的代码中。这是一个即将发生的缓冲区溢出漏洞,因为您无法控制用户输入的内容。在您的特定情况下,用户输入超过(大约)30 个字符可能会导致各种奇怪的行为。

scanf

功能用于扫描格式化文本,没有什么比用户输入更

未格式化
了:-) 如果您想要强大的用户输入功能,请参阅

此处


1
投票
number

声明为指向 Short int 的指针。然后将指向它的指针传递给

getData
echoPair
。所以你将一个指针传递给一个指针,这是错误的类型。也许您想将 number 声明为短整型而不是指针。
    

© www.soinside.com 2019 - 2024. All rights reserved.