初级内存分配

时间:2016-12-26 20:04:46

标签: c function memory allocation

我刚刚在一个月前开始使用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 
}

2 个答案:

答案 0 :(得分:3)

您的问题不在于内存分配。它是通过C传递参数值。您的函数分配内存但不能更新传入的参数,因为它只有它的值,而不是它的地址。

尝试

library(data.table)
setDT(crime)[nchar(as.character(Date.Rept)) < 18, Date.Rept := paste(Date.Rept, "12:00 AM")]
crime[, c("Date", "Time") := IDateTime(as.POSIXct(Date.Rept, format = "%m/%d/%Y %I:%M %p"))]
crime
#            Date.Rept       Date     Time
# 1: 12/1/2016 12:00 AM 2016-12-01 00:00:00
# 2: 12/1/2013 12:07 AM 2013-12-01 00:07:00
# 3: 12/1/2016  7:76 AM       <NA>     <NA>
# 4: 12/1/2016 11:54 AM 2016-12-01 11:54:00
# 5: 12/2/2016  1:34 PM 2016-12-02 13:34:00

答案 1 :(得分:-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 
}