在C语言中为结构体中的数组分配内存

3

我需要在C语言中定义一个包含要进行malloc的数组的type-struct:

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

typedef struct mine
{
    int N;
    double *A;
} mine;

int main(int argc, char** argv) 
{
    int i;
    mine *m=malloc(sizeof(mine));
    printf("sizeof(mine)=%d\n",sizeof(mine));
    scanf("Enter array size: %d",&(m->N));
    m->A=malloc((m->N)*sizeof(double));
    for(i=0; i < m->N; i++)
        m->A[i]=i+0.23;
    printf("First array element: %lf",m->A[0]);

    return (EXIT_SUCCESS);
}

程序编译成功并运行,整数赋值似乎正常工作。但是数组没有按照预期工作。
有什么建议吗?我希望 m 仍然是一个指针(以便传递给函数等)。
谢谢。

2
数组有什么问题?(即,您得到了什么输出,您想要什么?) - huon
7
“not working as it should” 的意思是“没有按照它应该的方式工作”。 - Nik Bougalis
2
scanf函数不接受“提示”字符串。在使用其输出之前,始终检查其返回值! - Mat
1
@H2CO3 所有这些评论都与主观编码风格有关...只有%d和sizeof的组合在理论上存在问题。实际上,很少有(如果有的话)编译器将size_t实现为除了“unsigned int”之外的任何其他类型。 - Lundin
3
我可以认为在决定将类型从mine更改为yours时,sizeof(* m)sizeof(mine)更安全。 - Nik Bougalis
显示剩余5条评论
2个回答

8
这是你的问题:
scanf("Enter array size: %d",&(m->N));

应该分为两个步骤:
printf("Enter array size: ");
scanf("%d",&(m->N));

(用于调试检查:)
printf("The size entered appears to be %d\n", m->N);

那么,你就可以知道你是否得到了预期的值!

1
值得一提的是,检查scanf()的结果以确保已经进行了赋值(在这种情况下,即读取并分配了一个intm->N)。 - hmjd

0
如果@abelenky回答了你的问题,那很好,但我一直被告知要将malloc的结果从它返回的void *转换为实际使用的类型。
mine *m = (mine *)malloc(sizeof(mine));

在C语言中,与C++不同的是,您不必对malloc的结果指针进行强制转换。当不必要时,我通常不进行强制转换,因为这可能会隐藏另一个问题。 - Déjà vu
我一直对这个演员阵容持有不同的看法,所以通常会让它保持原样。不过还是谢谢你。 - Salmon Strikes
没问题。我不知道C和C++规范之间的区别,但是我先学习了C++,这可能是为什么我仍然将其转换的原因。谢谢你指出来。 - Jared Beekman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接