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

afi*_*ser 0 compiler-construction pointers character short compiler-warnings

我的代码

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

如果这样做

    getData(number, string);
    echoPair(number, string);
Run Code Online (Sandbox Code Playgroud)

警告消失,但是在我输入getData函数中的第一个数字后,程序会出现"Segmentation fault:11".

任何人都知道如何删除警告并保持程序正常工作?

谢谢

pax*_*blo 5

这里有很多问题.


一,行:

short int *number = 0;
Run Code Online (Sandbox Code Playgroud)

应该:

short int number = 0;
Run Code Online (Sandbox Code Playgroud)

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


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

getData (&number, &string);
echoPair (&number, &string);
Run Code Online (Sandbox Code Playgroud)

至:

getData (&number, string);
echoPair (&number, string); // but see last point below.
Run Code Online (Sandbox Code Playgroud)

而且,最后,您不需要传递地址只是为了打印它,您只需传入值,因此:

echoPair (&number, &string);
Run Code Online (Sandbox Code Playgroud)

变为:

echoPair (number, string);
Run Code Online (Sandbox Code Playgroud)

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不以往任何时候都希望看到一个无限串扫描,如:

scanf ("%s", string);
Run Code Online (Sandbox Code Playgroud)

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

scanf功能用于扫描格式化文本,并且没有比用户输入更多未格式化的东西:-)

如果您需要强大的用户输入功能,请参见此处.