【问题标题】:Pointer Address is Not Printing指针地址未打印
【发布时间】:2021-07-07 01:22:43
【问题描述】:

以下代码的主输入为 1-5,这是代码将运行的次数。代码打印出指针分配前后的地址。

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

int main(int argc, char **argv)
{
    char character ;
    int integer ;
    char string[50] ;
    float fp ;
    int i, x = 5 ;
    
    char* cPointer ;
    int* intPointer ;
    char* sPointer ;
    float* fpPointer ;
    
    if (argc > 1)
    {
        x = atoi(argv[1]) ;
    }
    else if (x > 5 || x < 1)
    {
        printf("Invalid number, please input a number between 1-5!") ;
        exit (1) ;
    }
    
    int count = 0;
    while (count <= x)
    {
        printf("Please enter a character: ") ;
        scanf(" %c", &character) ;
        printf("Please enter an integer: ") ;
        scanf("%d", &integer) ;
        printf("Please enter a string: ") ;
        scanf("%s", string) ;
        printf("Please enter a floating point:") ;
        scanf("%f", &fp) ;
        
        printf("\n\nCharacter Pointer: %p", cPointer) ;
        printf("\nInteger Pointer: %p", intPointer) ;
        printf("\nString Pointer: %p", sPointer) ;
        printf("\nFloating Point Pointer: %p", fpPointer) ;
        
        printf("\n\nCharacter: %c", character) ;
        printf("\nInteger: %d", integer) ;
        printf("\nString: %s", string) ;
        printf("\nFloating Point: %.2f", fp) ;
        
        cPointer = &character ;
        intPointer = &integer ;
        fpPointer = &fp ;
        sPointer = string ;

        printf("\n\nCharacter Pointer: %p", cPointer) ;
        printf("\nInteger Pointer: %p", intPointer) ;
        printf("\nString Pointer: %p", sPointer) ;
        printf("\nFloating Point Pointer: %p\n\n", fpPointer) ;
        
        count++ ;
    }

    return 0;
}

问题出在输出上,第一次尝试得到的不是浮点的指针地址,而是(nil)

Character Pointer: 0x7f0eeed0c1f8                                                
Integer Pointer: 0x7f0eef2d6000                                                  
String Pointer: 0x7f0eef2e91c8                                                   
Floating Point Pointer: (nil)                                                    
                                                                                 
Character: a                                                                     
Integer: 1                                                                       
String: aa                                                                       
Floating Point: 1.10                                                             
                                                                                 
Character Pointer: 0x7ffe236e563f                                                
Integer Pointer: 0x7ffe236e5640                                                  
String Pointer: 0x7ffe236e5670                                                   
Floating Point Pointer: 0x7ffe236e5644                                           
                                                                                 
Please enter a character: b                                                      
Please enter an integer: 2                                                       
Please enter a string: bb                                                        
Please enter a floating point:2.2                                                
                                                                                 
                                                                                 
Character Pointer: 0x7ffe236e563f                                                
Integer Pointer: 0x7ffe236e5640                                                  
String Pointer: 0x7ffe236e5670                                                   
Floating Point Pointer: 0x7ffe236e5644                                           
                                                                                 
Character: b                                                                     
Integer: 2                                                                       
String: bb                                                                       
Floating Point: 2.20                                                             
                                                                                 
Character Pointer: 0x7ffe236e563f                                                
Integer Pointer: 0x7ffe236e5640                                                  
String Pointer: 0x7ffe236e5670                                                   
Floating Point Pointer: 0x7ffe236e5644  

【问题讨论】:

  • 如果您打印*cPointer 会发生什么情况,而其他Pointers 也是如此? (提示:您没有初始化 任何Pointer 变量。)
  • @ScottHunter 我不完全确定你的意思......但是,变量通过 scanf 被赋予了一个值,并且指针在之前和之后确实有一个地址。我只是因为一些奇怪的原因而错过了浮点数。
  • @Jon 指针一开始有一个未初始化的值,所以你在第一次运行时打印的值是没有意义的。
  • 您实际上在printf() 中调用了UB。看到这个:stackoverflow.com/questions/24867814/…

标签: c pointers crash runtime-error scanf


【解决方案1】:

没有初始化您声明的指针:

char* cPointer ;
int* intPointer ;
char* sPointer ;
float* fpPointer ;

然后您尝试打印它们的值:

printf("\n\nCharacter Pointer: %p", cPointer) ;
printf("\nInteger Pointer: %p", intPointer) ;
printf("\nString Pointer: %p", sPointer) ;
printf("\nFloating Point Pointer: %p", fpPointer) ;

这些变量的内容是未定义的!读取一个未初始化的变量是未定义的行为。在这里阅读更多:What happens to a declared, uninitialized variable in C? Does it have a value? 你不能期望任何有意义的结果,所以如果其中一些打印为(nil),那只是因为出于某种原因它们碰巧被初始化为0。您在此处打印的值是打印时堆栈上的任何乱码,它们毫无意义。无论如何,尝试打印它们可能会使程序崩溃。

然后,在第二组 printfs 之前,您实际上为指针分配了一些值:

cPointer = &character ;
intPointer = &integer ;
fpPointer = &fp ;
sPointer = string ;

当然,现在它们都被正确初始化为一个值,打印时你会得到有意义的结果。

【讨论】:

  • 以下是我收到的具体说明“定义指向这些变量类型的指针,而无需对这些指向以前的变量进行任何初始化。”您将如何解决问题?
  • @Jon 如果你的指令是“声明一堆指针,不要初始化它们然后打印它们的值”我建议给你写一封电子邮件教授问他们是从哪个谷物盒获得学位的,我也想要一个。要解决这个问题,好吧,只是在初始化变量之前不要打印变量。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2020-06-07
相关资源
最近更新 更多