C编程:解释为什么指针没有给出期望值

时间:2018-06-27 01:22:28

标签: c pointers

我对C语言中的指针非常陌生,无法理解此错误,或者指针无法访问内存以存储实际值。

#include <stdio.h>

int main() {
    int a;
    int *pA = &a;

    a = 9;

    *pA = 4;

    int *pA2 = &a;

    printf("pA = %p, *pA = %d, *pA2 = %d\n", *pA, *pA2);
}

在(虚拟)现实中, pA2 是否也不应该吐出 4 吗?相反,它给出的是与内存地址相关的数字。

谢谢

1 个答案:

答案 0 :(得分:1)

您已忽略了Product-> Scheme-> FirebaseCore Product -> Scheme -> nanopb Product -> Scheme -> GoogleToolBoxforMac 的参数。请考虑以下内容:

printf()

它再次输出一个存储器地址#include <stdio.h> int main() { int a; int* pA= &a; a = 9; *pA = 4; int* pA2 = &a; printf("pA=%p, *pA=%d, *pA2=%d\n", (void*) pA, *pA, *pA2); } 4Try it online.

对于要替换的每个4,必须将一个额外的参数传递给%。 当您忽略参数时,该函数将始终尝试获取参数-这会导致未定义的行为。在您的情况下,它设法取得了一个数字(可能是从堆栈中取出的)。这也可能使程序崩溃–由于行为是不确定的,因此无法始终如一地对其进行预测。

还请注意,我已投射了您指向输出的printf()的指针-void*格式说明符需要它。其他指针在大多数时间都可以使用,但不能保证能正常工作。详细了解%p here

为帮助您将来检测类似的问题和其他问题,请打开编译器警告。刚开始时,这些功能似乎不胜枚举,但它们确实很有帮助。请参阅使用@Davislor的注释here所建议的编译器标志编译的代码。

我已经添加了printf()。只要您的代码生成警告,编译器就不会生成可执行文件,因此它会迫使您实际处理警告。

我还在答案的第一个链接中添加了相同的标志,因此您可以看到它不会生成任何警告。