【问题标题】:Printf producing warnings when printing memory location yet still compiles and runs in xcodePrintf 在打印内存位置时产生警告但仍然在 xcode 中编译和运行
【发布时间】:2017-09-26 23:50:40
【问题描述】:

我是 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 会产生一条警告,指出“格式指定类型 'int' 但参数的类型为 'int *'。

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

非常感谢!

【问题讨论】:

    标签: c xcode pointers printf


    【解决方案1】:
    #include <stdio.h>
    

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

    此外,p 是指针,你必须取消引用它printf("Address of first element of a = %d\n", *p);

    请使用标志 gcc -W -Wall -Wextra file.c 编译您的 .c 文件

    edit :如果您要打印指针的地址而不是它所指向的值,请注意 printf 中的 %p 标志:printf("Address of first element of a = %p\n", p);

    【讨论】:

    • 你的第一点我应该注意到的。谢谢!但我想做的是打印数组中第一个索引的内存地址。那就是我遇到此警告的地方。如果我打印*p,它只会产生“1”,这是第一个索引的值,而不是内存位置。
    • @Pwrcdr87 留意我的编辑。 %p 不再是 %d
    • 是的,我在提交回复后注意到了您的更新。非常欣赏!那完成了工作。我有 C 'printf' 格式的参考,但在可用格式列表中没有看到 %p。感谢那。我还找到了涵盖%p 的代码列表。这就是解决方法和答案。再次感谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      (在几乎所有的计算机上,您都可以忽略 void * 的演员表,但这样做在形式上仍然是不正确的。它的严重程度与 @ 之间的任何其他类型不匹配一样严重987654328@ 格式字符串和参数:未定义的行为,这意味着程序可以正常工作,但也可以表现任意错误 - 股票笑话是“编译器可以让恶魔飞出你的鼻子”。)

      【讨论】:

      • 如果我这样做printf("adress : %p\n", p),为什么我们必须将指针转换为(void *)它已经打印了地址号?
      • 我也对@NicolasGuerin 问题的回复感兴趣。
      • 我试过打印p(void *)p的地址,它们是一样的。因此,您无需在 (void *) 已经是指针时就将其转换为。
      • 是的,您确实需要演员表,即使它已经是一个指针,即使它似乎可以在您的计算机上工作。如果你没有演员表,你就有“未定义的行为”,这意味着你可以在某些计算机上逃脱它,但在其他计算机上,恶魔会从你的鼻子里飞出来。我不是在拿恶魔开玩笑。
      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多