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
函数用于扫描格式化文本,没有什么比用户输入更未格式化的了:-)
如果您想要一个强大的用户输入功能,请参阅。非常感谢,请将其全部修复。正如您可能知道的,我是一个编程新手,这将只用于练习,但感谢您对可能溢出的输入,请记住,以备以后使用!非常感谢,都修好了。正如您可能知道的,我是一个编程新手,这将只用于练习,但感谢您对可能溢出的输入,请记住,以备以后使用!