C语言 输出未打印正确的变量地址

6uxekuva  于 2023-02-07  发布在  其他
关注(0)|答案(3)|浏览(135)

尽管使用double作为数据类型和正确的格式说明符,但输出不会打印正确的变量地址输出仅由零组成

#include <stdio.h>

void main() {
    double a[5] = { 6.0, 7.0, 8.0, 9.0, 10.0 };
    double *p;
    p = a;
    printf("%lf \n", p);
    for (int i = 0; i < 5; i++) {
         printf("%lf \n", p++);
    }
}

输出:

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
ljsrvy3e

ljsrvy3e1#

我修复了它与2个简单的变化,在评论中描述.

#include<stdio.h>
void main()
{
    double a[5]={6.0,7.0,8.0,9.0,10.0};
    double *p;
    p=a;
    printf("%p \n",p);       // Changed formatter to %p  to print addresses
    for(int i=0;i<5;i++)
    {
         printf("%p \n",p++); // Changed formatter to %p to print addresses
    }
}

输出

0x7fffdd887250 
0x7fffdd887250 
0x7fffdd887258 
0x7fffdd887260 
0x7fffdd887268 
0x7fffdd887270
qij5mzcb

qij5mzcb2#

printf的这些调用

printf("%lf \n",p);

以及

printf("%lf \n",p++);

调用未定义的行为,因为对指针使用了错误的转换说明符"%lf"(顺便说一句,长度修饰符即使用于double类型的对象也不起作用)。
您可以使用转换说明符%p,例如

printf("%p \n", ( void * )p);

以及

printf("%p \n", ( void * )p++);

或者,如果要将地址输出为整数,则可以包含标头<stdint.h><inttypes.h>(最后一个标头已经包含了第一个标头,并写入

包括#包括<stdint.h> #include <inttypes.h>

//...

printf("%" PRIuPTR "\n", ( uintptr_t )p);

以及

printf("%" PRIuPTR "\n", ( uintptr_t )p++);

注意,根据C标准,不带参数的函数main应声明为

int main( void )

这是一个演示程序。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main( void )
{
    double a[] = { 6.0, 7.0, 8.0, 9.0, 10.0 };
    const size_t N = sizeof( a ) / sizeof( *a );

    double *p = a;

    printf( "%p", ( void * )p );
    printf( " <-> %" PRIuPTR "\n", ( uintptr_t )p );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%p", ( void * )p );
        printf( " <-> %" PRIuPTR "\n", ( uintptr_t )p++ );
    }
}

程序输出为

00AFFE40 <-> 11533888
00AFFE40 <-> 11533888
00AFFE48 <-> 11533896
00AFFE50 <-> 11533904
00AFFE58 <-> 11533912
00AFFE60 <-> 11533920
wnvonmuf

wnvonmuf3#

也许可以像这样打印for循环:

for(int i=0;i<5;i++)
{
printf("%lf \n",p[i]++);
}

输出:0.000000
6.000000
7.000000
8.000000
9.000000
10.000000

相关问题