Printf在打印内存位置时仍会生成警告但仍在xcode中编译和运行

时间:2017-09-26 23:50:41

标签: c xcode pointers printf

我是C编程的新手,我正在尝试使用指针和数组。我有一个菜鸟问题,我想请大家帮我理解。

我正在使用Xcode运行一个非常简单的C程序,我正在编写。为了帮助我理解这是如何工作的,我将从一个非常基本的程序开始,然后慢慢地构建它以帮助学习。这是我的示例代码:

#include "stdio.h"

int main(){

    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    int *p = &a[0];

    printf("Address of first element of a = %d\n", p);
    printf("Number of elements in array = %lu\n", sizeof(a) / sizeof(int));

}

在Xcode中,第一个printf行产生一个警告,指出“Format指定类型'int'但参数的类型为'int *'。

如果我能清楚地了解为什么会发生这种情况以及我对此进行编码的正确方法,我会很感激吗?这仍然编译并运行它产生期望的结果。因此,虽然结果可能是正确的,但我个人需要了解这些警告的修复方法。

非常感谢!

3 个答案:

答案 0 :(得分:2)

#include <stdio.h>

使用""用于创建自己的.h文件

此外,p是你必须解除它的指针printf("Address of first element of a = %d\n", *p);

请使用标记gcc -W -Wall -Wextra file.c

编译.c文件

修改:如果您要打印指针的地址而不是指向的内容的值,请在printf中查找%p标志:{ {1}}

答案 1 :(得分:1)

您已将p声明为指向int的指针。如果要打印它所指向的值(在这种情况下为a [0]或1),则需要<div>an example value</div>,而不是*p作为printf的参数()

答案 2 :(得分:0)

指针的printf格式代码为%p。要打印数组的第一个元素的地址,您应该使用%p而不是%d,并且还必须将指针强制转换为void *

printf("Address of first element of a = %p\n", (void *)p);

在许多计算机上(包括,我认为,Xcode可以为其生成可执行文件的所有计算机),指针传递给可变参数函数的方式与完整大小相同,这就是为什么你得到&#34;期望结果&#34 ;.但是用%d而不是%p打印指针仍然是不正确的,这就是Xcode抱怨的原因。

(在几乎所有计算机上,你都可以将演员阵容遗漏给void *,但这样做仍然是正确的。它的严重程度与任何其他类型的不匹配一样严重。 printf格式字符串和参数:未定义的行为,意味着允许程序正常工作但也允许行为任意错误 - 股票笑话是&#34;允许编译器让恶魔飞出你的鼻子&#34;。)