数组/指针和scanf

数组/指针和scanf,c,arrays,pointers,dynamic,initialization,C,Arrays,Pointers,Dynamic,Initialization,我的代码有问题。 我正在创建一个动态数组并请求一些值。 但当我在屏幕上打印它们时,数组似乎未初始化 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.

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

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]);

谢谢大家!

你的问题是双重*p。您需要一个指针数组来键入double:

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;
}
int main(无效)
{
int i,j;
双**p;
printf(“多少数字?\n”);
scanf(“%d”、&i);
p=(双**)malloc(sizeof(双*)*i);
对于(j=0;j
您在读取双精度字符时使用了错误的格式说明符:

    scanf("%f", p+j);
    scanf("%lf", p+j);
使用
%lf
读取双精度:

    scanf("%f", p+j);
    scanf("%lf", p+j);
您可能会感到困惑,因为printf()使用
%f
来打印
浮点数
双精度
,而scanf()需要不同的格式说明符。阅读这篇文章:

使用以下方法:

scanf("%f", p+(j*sizeof(double));
指针p存储数组第一个元素的地址。第二个元素将位于以下地址:


[第一个地址]加上一个元素。你想要的元素是双倍的,所以你去吧

他的原始代码正确分配内存,我不明白为什么要将一维数组扩展为二维数组。你给malloc增加了假演员不。。。将
1
添加到指针会使其指向下一个元素,而不考虑元素大小
p+j
(又名
&p[j]
)是正确的。@MattMcNabb非常感谢您的更正!我不知道,可能是复制品