gpt4 book ai didi

C 指针初始化差异

转载 作者:行者123 更新时间:2023-11-30 20:11:37 33 4
gpt4 key购买 nike

我是 C 新手,对指针有一些疑问。

问题1 以下两者有何不同?哪种方式初始化指针更好?为什么?

int *p=NULL;
int *p;
<小时/>
#include <stdio.h>
void main()
{
char *s = "hello";
printf("%p\t%p",s);
//printf("%p\t%p",&s) it will give me unpredictable result every time
//printf("%p\t%p",(void *)&s) it will be fine
//Question3: why?
}

问题 2:我尝试用 google 搜索 %p 正在做什么。根据我的阅读,它应该打印指针。这意味着它打印了指针的地址?

最佳答案

问题1,这些是指针p的定义。一种将指针初始化为NULL,另一种将其保留为未初始化(如果它是函数中的局部变量,而不是全局变量,则全局变量默认初始化为 0)。使用 NULL 初始化可能是好的,也可能是坏的,因为编译器可以警告您有关未初始化变量的使用并帮助您查找错误。另一方面,编译器无法检测到未初始化变量的所有可能使用,因此初始化为 NULL 几乎肯定会在使用时产生段错误,然后您可以非常轻松地使用调试器捕获和调试该错误。就我个人而言,我会始终在定义变量时进行初始化,如果可能的话使用正确的值(如果初始化对于单个语句来说太复杂,请添加一个辅助函数来获取值)。

问题2,%p打印传递给printf的地址值。因此 printf("%p",pointer); 获取变量 pointer并打印出来,而 printf("%p", &pointer); (注意那里额外的 &)获取变量 pointer 的传递地址,并打印它。 %p 的精确数字格式是实现定义的,它可能会像普通数字一样打印。

问题 3 是关于未定义的行为,因为格式字符串的项目比您实际传递给 printf 的项目多。简而言之,行为是不确定的,没有“为什么”。更长的答案是,使用机器代码调试器运行应用程序,并在反汇编 View 中跟踪执行情况,看看实际发生了什么,看看为什么。请注意,不同的运行结果可能会有所不同,并且在调试器和正常运行下的行为可能会有所不同,因为由于各种原因,内存在不同的运行中可能具有不同的字节值。

关于C 指针初始化差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40013326/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com