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