我对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 吗?相反,它给出的是与内存地址相关的数字。
谢谢
答案 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);
}
和4
。 Try it online.
对于要替换的每个4
,必须将一个额外的参数传递给%
。
当您忽略参数时,该函数将始终尝试获取参数-这会导致未定义的行为。在您的情况下,它设法取得了一个数字(可能是从堆栈中取出的)。这也可能使程序崩溃–由于行为是不确定的,因此无法始终如一地对其进行预测。
还请注意,我已投射了您指向输出的printf()
的指针-void*
格式说明符需要它。其他指针在大多数时间都可以使用,但不能保证能正常工作。详细了解%p
here。
为帮助您将来检测类似的问题和其他问题,请打开编译器警告。刚开始时,这些功能似乎不胜枚举,但它们确实很有帮助。请参阅使用@Davislor的注释here所建议的编译器标志编译的代码。
我已经添加了printf()
。只要您的代码生成警告,编译器就不会生成可执行文件,因此它会迫使您实际处理警告。
我还在答案的第一个链接中添加了相同的标志,因此您可以看到它不会生成任何警告。