警告:格式’%d’需要类型’int *’,但参数2的类型为’int’
所以我是C的新手,我遇到了这个警告发生的问题。 警告意味着什么,我该如何解决它。 我写的代码在这里:
void main(void) { char* name = ""; int age = 0; printf("input your name\n"); scanf("%s\n", name); printf("input your age\n"); scanf("%d\n", age); printf("%s %d\n", name, age); }
scanf
函数获取变量的地址以将结果放入。
写scanf("%d", & someVar)
将传递someVar
变量的地址 (使用&
unary运算符)。
scanf
函数会将一个数字放入该地址的内存中。 (包含你的变量)
当您编写scanf("%d", age)
,将age
变量的值传递给scanf
。 它将尝试将一个数字放入地址0
处的内存中(因为age
为0
),并且可怕地搞砸了。
你需要传递&age
到scanf
。
您还需要为scanf
分配内存以将字符串读入name
:
char name[100]; scanf("%99s\n", name);
问题是这一行:
scanf("%d\n", age);
scanf需要指针参数 – 这是函数可以修改C中参数的唯一方法。为了解决这个问题,你需要:
scanf("%d\n", &age);
它传递了ageof的地址,它现在是一个指针(指针是一个包含另一个内存区域的地址的变量)。
至于这个:
char* name = "";
哎哟,超重,请 – 不要! 好的,我需要解释一下。 你已经要求指向一个字符类型的指针,但就每个人而言,你所拥有的只是一个字符,而不是整个字符串。 没错,空间不够。 为什么C允许你这样做? 好吧,C基本上是可移植的汇编程序,所以你可以在内存中的任何地方编写(或者更确切地说,你可以尝试编译器不会不同意,但操作系统可以并且可能会)。
你需要做的是使用malloc
读取内存分配以分配一些空间,否则我可以输入一个大量的字符串,然后将它放在name的地址上。
这虽然决不会导致基于堆栈的漏洞。 什么, 堆叠? 是。 堆栈是一个FILO结构,每次调用一个函数时,都会在堆栈中为返回地址和函数参数添加空间,以及频繁的函数范围变量。
如果您不检查输入大小,这将成为一个问题。 然后,我可以为您的堆栈写入大量值,包括可执行代码…请参阅缓冲区溢出 。
我听说你如何减轻这种影响,只是渴望不实施软件漏洞? 您可以使用允许您指定缓冲区输入大小的函数并读入特定大小的缓冲区,然后从那里开始。 而已。 那很简单。
看到这个问题: C中的字符串读取 。
你应该写scanf("%d", &age)
,因为scanf
函数需要修改 age
的值,因此需要“通过地址”而不是“按值”传递它。
这意味着它期望一个“int *”(即:一个指向整数的指针),但你给它“int”这是一个整数。 要修复它,请在scanf行中添加&age以使其成为。
scanf(“%d \ n”,年龄);
我假设它在线scanf("%d\n", age);
问题是扫描f期望指向变量的指针而不是变量。 你需要通过使用’&’来获得变量的地址,你应该没问题。
警告意味着它所说的内容:编译器期望在scanf
调用中指向int
而不是int
的指针。
快速修复:用age
替换age
,一切都会有效。
C按值传递所有参数,这意味着如果传递变量,则仅传递变量的值。 接收函数可以根据需要修改该值,但原始值不会更改。 要更改变量,需要以某种方式传递指向变量的值,在C中是指针。
要获取指向变量的指针,请在其前面加上&
。 要使用变量,你有一个指针,指针值前缀为*
。
在这种情况下,您希望scanf
更改age
的值,因此您需要将指针传递给它。
char* name = "";
name
指向一个位或大到足以容纳单个空字符的内存。
scanf("%s\n", name);
您要求在此地址读取和存储未知数量的字符。 任何事情都可能发生。 你必须确保name
大小足以容纳scanf()
可能读取的任何内存块的地址。
char twenty_bytes[20] = ""; scanf("%s\n", twenty_bytes);