我的警告格式为“%d”,期望参数的类型为“ int”,但是参数2的类型为int *

时间:2019-11-25 15:37:34

标签: c

Hello World我对C完全陌生,我正试图弄清指针的工作原理,所以我不知道为什么这个错误出现在我身上:

#include <stdio.h>
#include <stdlib.h>

void myPtr(int *nbr)
{
    nbr = (void *)142;
    printf("%d",nbr);
}
int main()
{
    int *p;
     myPtr(p);
}

2 个答案:

答案 0 :(得分:0)

nbr的类型为int *,即它是指向内存中地址的指针,而取消引用该指针以获取其值将返回一个int。

我建议在myPtr函数中对您的代码进行以下修改:

首先,要设置nbr指向内存中包含整数142的位置,请使用:

nbr = (int *)malloc(sizeof(int));
*nbr = 142;

第一行为该指针分配内存,第二行取消对该指针的引用并将该地址的值设置为142。

第二,更改print语句以使用值而不是地址,如下所示:

printf("%d",*nbr);

由于nbr的类型为int *,而%d想要的是int而不是int指针,因此会出现打印nbr而不是* nbr的错误。

所有这些都假设您要打印出值142。如果要打印其他值,我的更改不会导致这种情况发生。

我希望我已经回答了您的问题,祝您C运气好!

答案 1 :(得分:0)

您的程序中发生了几件事。让我们从这一点开始:将指针视为计算机内存中的地址。在main()中,您说的是“ p是存储整数的位置的地址” ...在大多数实现中,这将是4个字节。但是p当前没有值。

在myPtr()例程中,将该地址设置为142:您告诉程序地址0x000008e(相当于142的十六进制)是4个字节的内存整数,但是您不知道该地址存储了什么。

printf()格式说明符“%d”表示您将传递一个整数...但是传递的是指向内存的指针,这就是为什么收到此警告的原因。如果您要打印的是地址,则可以使用“%p”格式,它告诉printf()实际上是在传递指针。

另一方面,如果要打印数字,则需要取消引用指针:

printf("%d", *nbr);

在大多数系统上遇到的问题是,您将遇到内存访问错误:大多数系统上的受保护内存页面(“页面0”)中都有地址0x0000008e(142),并且您可以通常不会读取或写入该内存。

我认为您需要找到一个很好的C指针在线教程,使用&获取变量的地址,并使用*访问指针。