C语言中的指针:给int赋值*

C语言中的指针:给int赋值*,c,pointers,C,Pointers,当我们提供如下定义时,这里到底发生了什么 int * a = 2; 幕后到底发生了什么 解决了的 此处a将指向内存地址2。从整数到指针的转换结果在C中定义,引用C99第6.3.2.3节: 5整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示 因此,您不应该依赖这种转换,除非文本为0,这将给您一个空指针 实际上,您可能会发现指针将保存整数常量指定的内存地址: #include <stdio.h> int

当我们提供如下定义时,这里到底发生了什么

int * a = 2;
幕后到底发生了什么


解决了的
此处
a
将指向内存地址2。

从整数到指针的转换结果在C中定义,引用C99第6.3.2.3节:

5整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示

因此,您不应该依赖这种转换,除非文本为0,这将给您一个空指针

实际上,您可能会发现指针将保存整数常量指定的内存地址:

#include <stdio.h>

int main(void) {
  int * a = 2;
  printf("%p", a); /* prints 0x2 in gcc */
  return 0;
}

从整数到指针的转换结果在C中定义,引用C99第6.3.2.3节:

5整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示

因此,您不应该依赖这种转换,除非文本为0,这将给您一个空指针

实际上,您可能会发现指针将保存整数常量指定的内存地址:

#include <stdio.h>

int main(void) {
  int * a = 2;
  printf("%p", a); /* prints 0x2 in gcc */
  return 0;
}
在这里,将不分配“a”的内存。因此,它给出了分割错误

它将尝试将2作为地址,指针a将尝试指向地址2。但这可能是因为我们的系统没有该地址,也可能是因为它被分配给了其他进程

因此,在编译时,它将给出一条警告消息

警告:初始化将指针从整数转换为不带强制转换的整数[默认情况下启用]

此处将不分配“a”的内存。因此,它给出了分割错误

它将尝试将2作为地址,指针a将尝试指向地址2。但这可能是因为我们的系统没有该地址,也可能是因为它被分配给了其他进程

因此,在编译时,它将给出一条警告消息


警告:初始化使指针从整数指向不带强制转换的整数[默认情况下启用]

@AAA--它使
a
指向地址0x2处的内存,地址0x2通常不可访问且错误,但在您错误地取消引用
a
之前不会中断。从技术上讲,它也可以做一些对实现有意义的不同的事情,但在实践中,这是毫无意义的。永远不要这样做。@inbinder如果我理解正确,是否意味着a持有内存地址2(或第三字节地址)。不要编辑问题来标记它已解决。只需将对您有帮助的答案标记为“此处a将指向内存地址2”是未定义的行为,这是一种可能的特定于实现的结果。@AAA--它将
指向地址0x2处的内存,地址0x2通常不可访问且错误,但在您犯了取消引用
a
的错误之前不会中断。从技术上讲,它也可以做一些对实现有意义的不同的事情,但在实践中,这是毫无意义的。永远不要这样做。@inbinder如果我理解正确,是否意味着a持有内存地址2(或第三字节地址)。不要编辑问题来标记它已解决。只需将有助于您的答案标记为“此处a将指向内存地址2”就足够了,这不是定义的行为,这是一个可能的特定于实现的结果。我不明白这是如何回答这个问题的。@Rob现在好了吗?我不明白这是如何回答这个问题的。@Rob现在好了吗?它没有给出分段错误。如果您尝试使用该指针值a。这将导致分割错误。示例打印指向地址中的值。它不会给出分段错误。如果您尝试使用该指针值a。这将导致分割错误。在定点地址中打印值的示例。