当我们提供如下定义时,这里真的发生了什么?
public Publication(String pubTitle, double pubCost, int pubQuantity)
{
title = pubTitle;
cost = pubCost;
quantity = pubQuantity;
}
幕后真的发生了什么?
此处int * a = 2;
将指向内存地址2。
答案 0 :(得分:4)
从整数到指针的转换结果是在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;
}
大多数编制者也会警告这个不安全的演员:
$ gcc test.c test.c: In function ‘main’: test.c:4:13: warning:
initialization makes pointer from integer without a cast [enabled by
default] int * a = 2;
^
答案 1 :(得分:0)
在这里,“a”的内存不会被分配。因此,它给出了分段错误。
它会尝试将2作为地址,而指针a将尝试指向地址2.但可能是我们的系统没有该地址,或者它可能被分配给其他进程。
因此,在编译时,它会给出一条警告信息。
警告:初始化使得整数指针没有强制转换[默认情况下启用]