【问题标题】:Array/Pointer and scanf数组/指针和scanf
【发布时间】:2014-05-27 20:36:35
【问题描述】:

我的代码有问题。 我正在创建一个动态数组并要求一些值。 但是当我在屏幕上打印它们时,数组似乎未初始化。

int main(void)
{
    int i, j;
    double *p;
    printf("How much numbers?\n");
    scanf("%d", &i);
    p = malloc (sizeof(double)*i);
    for(j = 0; j < i; j++)
    {
        printf("Set nr. %d :\n", j);
        scanf("%f", p+j);
    }
    for(j = 0; j < i; j++)
    {
        printf("Nr. %d = %f\n", j, *(p+j));
    }
}

我认为问题应该出在这一行,但我不知道为什么?

scanf("%f", p+j);

我也试过这个版本的代码:

scanf("%f", (p+j));
scanf("%f", &p[j]);

谢谢!

【问题讨论】:

标签: c arrays pointers dynamic initialization


【解决方案1】:

读取双精度的格式说明符有误:

    scanf("%f", p+j);

使用%lf 读取双精度:

    scanf("%lf", p+j);

您可能会感到困惑,因为 printf() 使用 %f 来打印 floatdouble 而 scanf() 需要不同的格式说明符。阅读这篇文章:

Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

【讨论】:

    【解决方案2】:

    使用这个:

    scanf("%f", p+(j*sizeof(double));
    

    指针 p 存储数组第一个元素的地址。第二个元素将位于地址:

    [First Address] PLUS 一个元素。你想要的元素是双重的,所以你去!

    【讨论】:

    • no... 将1 添加到指针使其指向下一个元素,无论元素大小如何。 p+j(又名。&amp;p[j])是正确的。
    • @MattMcNabb 非常感谢您的指正!我不知道。
    【解决方案3】:

    你的问题是双 *p。你需要一个指针数组来输入双精度:

    double **p;
    

    你还需要做这样的事情:

    int main(void)
    {
        int i, j;
        double **p;
        printf("How much numbers?\n");
        scanf("%d", &i);
        p = (double **)malloc (sizeof(double*)*i);
        for(j = 0; j < i; j++)
        {
            printf("Set nr. %d :\n", j);
            p[j] = (double *)malloc(sizeof(double));
            scanf("%lf", p[j] );
            printf ("p[%d]: %f\n", j, *p[j]);
        }
        for(j = 0; j < i; j++)
        {
            printf("Nr. %d = %f\n", j, *p[j]);
        }
        return 0;
    }
    

    【讨论】:

    • 他的原始代码正确分配内存,我不明白为什么要将一维数组扩展为二维。而且你已经向 malloc 添加了虚假的演员表。
    猜你喜欢
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多