警告:格式'%d'需要类型'int*',但参数2的类型为'int'

Zie*_*zer 9 c compiler-construction warnings

所以我是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);

}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 12

scanf函数获取变量的地址以将结果放入.
写入将通过地址的的变量(使用一元运算符). 该函数会将一个数字放入该地址的内存中.(包含你的变量)scanf("%d", &someVar)someVar&
scanf

写入时scanf("%d", age),将变量的传递agescanf.它会尝试将一个数字放入地址处的内存中0(因为age0),并且可怕地搞砸了.

你需要传递&agescanf.

您还需要为scanf读取字符串分配内存name:

char name[100];
scanf("%99s\n", name);
Run Code Online (Sandbox Code Playgroud)


小智 6

问题是这一行:

scanf("%d\n", age);
Run Code Online (Sandbox Code Playgroud)

scanf需要指针参数 - 这是函数可以修改C中参数的唯一方法.为了解决这个问题,你需要:

scanf("%d\n", &age);
Run Code Online (Sandbox Code Playgroud)

它传递了ageof的地址,它现在是一个指针(指针是一个包含另一个内存区域的地址的变量).

至于这个:

char* name = "";
Run Code Online (Sandbox Code Playgroud)

哎哟,超重,请 - 不要!好的,我需要解释一下.你已经要求指向一个字符类型的指针,但就每个人而言,你所拥有的只是一个字符,而不是整个字符串.没错,空间不够.为什么C允许你这样做?好吧,C基本上是可移植的汇编程序,因此你可以在内存中的任何地方编写(或者更确切地说,你可以尝试编译器不会不同意,但操作系统可以并且可能会).

您需要做的是读取内存分配malloc,以便分配一些空间,否则我可以输入一个大量的字符串,并将其放在名称的地址上.

这虽然决不会导致基于堆栈的漏洞.什么,堆叠?是.堆栈是一个FILO结构,每次调用一个函数时,都会在堆栈中为返回地址和函数参数添加空间,以及频繁的函数范围变量.

如果您不检查输入大小,这将成为一个问题.然后,我可以为您的堆栈写入大量值,包括可执行代码...请参阅缓冲区溢出.

我听说你如何减轻这种影响,只是渴望不实施软件漏洞?您可以使用允许您指定缓冲区输入大小的函数并读入特定大小的缓冲区,然后从那里开始.而已.那么简单.

看到这个问题:用C读取字符串.