gpt4 book ai didi

c - 三重指针异常输出

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:22 26 4
gpt4 key购买 nike

当我在编写代码以掌握指针的用法,并且分配双指针和三指针以查看会发生什么时,我得出了这个结果。这是代码:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{

struct entry
{
int value ;
struct entry *next ;
} ;

struct entry n1, n2, n3 ;

struct entry* Ptr1 ;
struct entry* *Ptr2 ;
struct entry* **Ptr3 ;

n1.value = 100 ;
n2.value = 200 ;
n3.value = 300 ;

Ptr1 = &n1 ; /* Ptr1 points to entry n1 */

Ptr1 = &n3 ; /* Ptr1 now points to n2 */

Ptr2 = &Ptr1 ; /* Ptr2 points to where pointer Ptr points, i.e the entry n3 */

Ptr3 = &Ptr2 ; /* Moreover, Ptr3 points to where pointer Ptr2 does. */


printf("\n The value of where Ptr1 points is : %d,\n The address of Ptr1 is : %d \n" , *Ptr1, Ptr1) ;
printf("\n The value of where Ptr2 points is : %d,\n The address of Ptr2 is : %d \n", **Ptr2, Ptr2) ;
printf("\n The value of where Ptr3 points is : %d,\n The address of Ptr3 is : %d \n", ***Ptr3,Ptr3) ;

printf("\n") ;

printf(" The value of where Ptr2 points is : %d ,\n The value of where Ptr3 points is : %d ", **Ptr2, ***Ptr3 ) ;

system("pause") ;

}

这是我的输出:

    The value of where Ptr1 points is : 300
The address of Ptr1 is :-858993460

The value of where Ptr2 points is : 300
The address of Ptr2 is :-858993460

The value of where Ptr3 points is : 300
The address of Ptr3 is :-858993460

虽然在单行中,我只打印了 Ptr2 和 Ptr3 指向的值,但我得到了这个:

  The value of Ptr2 is : 300
The value of Ptr3 is : -858993460

我不明白。难道不应该在一次打印中打印相同的结果吗?我错过了什么吗?

先行感谢。

最佳答案

您发送给 printf 的第二个值每次都是错误的。这是因为您将整个结构传递给 printf,而不仅仅是整数。我可以深入讨论这个细节(我在下面做了一些),但只知道 printf 是一个可变参数函数,而可变参数函数在 C 中非常挑剔。

实际发生的是,当您将其作为第一个参数传入时,您正在将整个入口结构复制到堆栈上。作为引用,您的结构的大小是 8 字节(好吧,出于教学目的,它是)。

函数的可变参数(如 printf)被视为堆栈上的一堆字节。因此,当您从 printf 中请求第一个整数时(使用 %d 说明符),它会从堆栈中取出前 4 个字节。这些是您的结构的前 4 个字节,恰好是第一个成员,您的 value

当您使用另一个 %d 请求接下来的 4 个字节时,结果是结构中未初始化的指针 next 的值。一些编译器,如 Visual Studio 的,喜欢用值 0xCCCCCCCC 初始化指针,以表明它们尚未设置。在十进制中,这是 -858993460。 每次您调用 printf 时,这个未初始化的指针都是第二个打印的整数。如果您要在其中的任何一个中打印另一个整数,由于结构的大小 printf 语句,你会得到你想要的实际地址。

所以对于解决方案,只需打印结构的值成员:

printf("\n The value of where Ptr1 points is : %d,\n The address of Ptr1 is : %d \n" , Ptr1->value, Ptr1) ;
printf("\n The value of where Ptr2 points is : %d,\n The address of Ptr2 is : %d \n", *Ptr2->value, Ptr2) ;
printf("\n The value of where Ptr3 points is : %d,\n The address of Ptr3 is : %d \n", **Ptr3->value,Ptr3) ;

所以你的问题实际上不是双指针或三指针,而是 C 的一些奇怪功能。

请记住,如果您使用 -> 运算符,则需要少一个取消引用运算符 *

请注意您实际传递给 printf 的内容。

关于c - 三重指针异常输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21816580/

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