2016-12-26 75 views
1

我刚刚在一个月前开始编程C语言,而且我显然不明白关于内存分配的一些事情,即使我已经从几个不同的来源读到它。初学者级别的内存分配

如果有人能解释为什么这个简单的例子我犯了崩溃,我会非常感激。 (对不起英语不好)

void test(double *x) 
{ 
    x = (double *)malloc(2 * sizeof(double)); 
    x[0] = 2; 
    x[1] = 3; 
} 

int main() 
{ 
    double *x = NULL; 
    test(x); 

    printf(" %f", x[0]); //this is where it crashes with no message 
} 
+4

请删除'C++'标签。 *我们正在与'c' *交战。 < - 笑话。放松。但严重的是,你应该删除'C++'标签。这些日子是两种不同的语言。 – 2016-12-26 20:06:04

+0

一个调试器和两个断点。如果你在两种情况下检查存储在'x'中的地址,'test'结尾处的一个和'main'中''printf''的一个将显示出问题。提示:在'test'中赋值'x = ...'对调用者('main')意味着* nothing *,并且'x'保持不变。 – WhozCraig

+0

1)不要将'malloc()'2)返回的值转换为调用程序中指针指向新地址,指针必须作为“指针指针”传递。 I.E. '测试(&x);''和函数测试需要签名:'void test(double ** x)'注意'**'然后设置该值必须取消引用传入的指针IE * * = malloc(2 * sizeof(double));'然后'x'是指向指针的指针(并注意C运算符的优先级)使用:'(* x)[0] = 2;' – user3629249

回答

3

你的问题不是内存分配问题。这是与C的价值参数传递。你的函数分配内存,但不能更新传入的参数,因为它只有它的值,而不是它的地址。

尝试

void test(double **x) 
{ 
    *x = (double *)malloc(2*sizeof(double)); 
    (*x)[0] = 2; 
    (*x)[1] = 3; 
} 
int main() 
{ 
    double *x = NULL; 
    test(&x); 

    printf(" %f", x[0]); //this is where it crashes with no message 
} 
-1

我不知道到底是为什么指针不更新,但如果你是一个指针结构通过它的工作等方面,需要更新指针像所以。 如果您正在分配的指针的类型为void,那么您只需要投射数据类型。

double *test() 
    { 
     double *x = malloc(2*sizeof(double)); 
     x[0] = 2; 
     x[1] = 3; 
     return x; 
    } 

int main() 
{ 
    double *x = test(); 


    printf(" %f", x[0]); //this is where it crashes with no message 
} 
+0

函数参数,传递并接收? –

+0

这是唯一的方法,否则你需要传递一个指针指针,无论你的偏好如何。 –

+0

哦谢谢xD我只注意到我忘了设置函数参数! –