Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中int指针返回的(nil)值_C_Pointers_Gnu - Fatal编程技术网

c中int指针返回的(nil)值

c中int指针返回的(nil)值,c,pointers,gnu,C,Pointers,Gnu,当我们声明一个指针时,它指向内存中的某个随机位置或地址,除非我们显式地为它指定任何变量的特定valueaddress 以下是代码: int *p; printf("int is %p\n",p); float *j; printf("float is %p\n",j); double *dp; printf("double is %p\n",dp); char *ch ; printf("char is %p\n",ch); j=(float *)p; printf("ca

当我们声明一个指针时,它指向内存中的某个随机位置或地址,除非我们显式地为它指定任何变量的特定valueaddress

以下是代码:

int *p;

printf("int is %p\n",p);

float *j;

printf("float is %p\n",j);

double *dp;

printf("double is %p\n",dp);

char   *ch ;

printf("char is %p\n",ch);

j=(float *)p;

printf("cast int to float %p\n",j);
输出:

int is (nil)

float is 0x400460

double is 0x7fff9f0f1a20

char is (nil)

cast int to float (nil)
它不打印随机位置,而是打印零


这里的零是什么??我不理解这里指针的行为???

未初始化的指针变量不指向随机地址。它们指向的位置未定义

实际上,它们具有堆栈中剩余的值,这一点您无法确定。在您的示例中,这几个指针恰好有0个值,所以它们恰好是空指针,并且它们打印为nil


永远不要依赖这种行为。

如果gnu标记表示您正在使用glibc,那么原因是glibc中的printf实现在遇到空指针时将打印nil

换言之,您的几个指针恰好具有空值0,因为堆栈上的特定位置正好是空值0。

您的所有指针都是零/未定义的,或者只是堆栈中的随机值


参见:

详细阐述@yu hao所说的:

每当调用一个子例程时,都会为该子例程分配一个堆栈帧。在遇到return语句之前,此帧一直存在

子例程通常需要内存空间来存储局部变量的值,这些变量仅在活动子例程中已知,并且在返回后不保留值。为此,编译器只需将堆栈顶部移动足够大的距离以提供空间,即可为此用途分配空间。与使用堆空间的动态内存分配相比,这是非常快的。请注意,子例程的每次单独激活都会在堆栈中为称为堆栈帧的局部变量获得自己的单独空间

这样做的主要原因是跟踪每个活动子例程在完成执行时应返回控制的点。活动子例程是一个已被调用但尚未完成执行的子例程,在该子例程完成后,应将控制权交回调用点。作为特例,子例程的这种激活可以嵌套到递归的任何级别,从而形成堆栈结构。例如,如果子例程DrawSquare从四个不同的位置调用子例程DrawLine,则DrawLine必须知道在其执行完成时返回的位置。为了实现这一点,调用指令后面的地址(返回地址)也会随着每次调用一起推送到调用堆栈上

回到您的问题,在执行过程中,函数可以对其堆栈帧进行更改,当函数“返回”时,其帧将从堆栈中“弹出”。
但在此过程中,堆栈的内容保持不变。只有堆栈指针被修改为指向上一帧。因此,当调用一个新的子例程时,会在前一个子例程的基础上分配新的帧,如果该子例程有未初始化的变量,它们将打印存储在分配给它们的内存中的值。这将取决于堆栈在该时间点的状态。

因此这意味着存储在未初始化指针中的值可能是0,也可能是未初始化指针中的某个随机值stack@user4255847它们有未定义的值,特别是,它们不是随机的,让我再说一遍。随机性有一定的要求,我不会称之为保护。打印带有%p的指针值不会取消对指针的引用;输出是实现定义的,但它是完全安全的。@KeithThompson:很公平。FWIW、IIRC glibc在必须取消引用指针的情况下具有空ptr保护。