Pointers &引用;不兼容的指针类型“;用C语言编译

Pointers &引用;不兼容的指针类型“;用C语言编译,pointers,compiler-construction,compiler-warnings,character,short,Pointers,Compiler Construction,Compiler Warnings,Character,Short,我的代码 如果你这样做 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 argu

我的代码

如果你这样做

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函数中输入第一个数字后,程序会得到一个“Segmentation fault:11”

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


谢谢

将局部变量
number
声明为指向short int的指针。然后将指向它的指针传递给
getData
echoPair
。所以你把一个指针传递给一个指针,它的类型是错误的。可能您希望将数字声明为一个短int而不是指针。

您将局部变量
number
声明为指向短int的指针。然后将指向它的指针传递给
getData
echoPair
。所以你把一个指针传递给一个指针,它的类型是错误的。可能您想将数字声明为一个短int而不是指针。

这里有很多问题


首先,行:

    getData(number, string);
    echoPair(number, string);
应该是:

short int *number = 0;
因为您使用了前者,所以它为您提供了一个指向
short
的空指针。这不是您想要的,因为第一次对beast的取消引用可能会使您的代码崩溃(或者,更糟糕的是,不是使代码崩溃,而是导致奇怪的行为)


其次,您不需要传入字符串的地址,它们会自动衰减到一个地址,因此更改:

short int number = 0;
致:


最后,您不需要仅为了打印而传入地址,只需传入值即可,因此:

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

echoPair (&number, &string);

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

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

scanf
函数用于扫描格式化文本,没有什么比用户输入更未格式化的了:-)


如果您想要一个强大的用户输入功能,请参阅。

这里有许多问题


首先,行:

    getData(number, string);
    echoPair(number, string);
应该是:

short int *number = 0;
因为您使用了前者,所以它为您提供了一个指向
short
的空指针。这不是您想要的,因为第一次对beast的取消引用可能会使您的代码崩溃(或者,更糟糕的是,不是使代码崩溃,而是导致奇怪的行为)


其次,您不需要传入字符串的地址,它们会自动衰减到一个地址,因此更改:

short int number = 0;
致:


最后,您不需要仅为了打印而传入地址,只需传入值即可,因此:

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

echoPair (&number, &string);

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

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

scanf
函数用于扫描格式化文本,没有什么比用户输入更未格式化的了:-)


如果您想要一个强大的用户输入功能,请参阅。

非常感谢,请将其全部修复。正如您可能知道的,我是一个编程新手,这将只用于练习,但感谢您对可能溢出的输入,请记住,以备以后使用!非常感谢,都修好了。正如您可能知道的,我是一个编程新手,这将只用于练习,但感谢您对可能溢出的输入,请记住,以备以后使用!