我的问题是我不确定如何正确分配内存。我研究过但无济于事。关于malloc的一些帮助会很棒。
int main(int argc, char *argv[]) {
int i, a[5000], c = 1, m, n, input;
scanf("%d", &input);
for (i = 0; i <= 9999; i += 2) {
a[c] = i;
c++;
}
for (n = 2; n < 1118; n++) {
for (m = a[n]; m < a[5000]; m++) {
a[m] = a[m+1];
}
}
printf("%d", a[input]);
free (*a);
return 0;
}
答案 0 :(得分:2)
首先,C数组具有基于0的索引。通过将c
的初始值设置为1
,然后在循环中使用as作为索引,您将逐个进行操作。这会调用undefined behavior。
之后,您不需要执行free (*a);
,a
是一个数组,而不是内存分配器函数malloc()
或家族返回的指针。
也就是说,在此代码中,*a
根本没有给出指针,它与类型为a[0]
的{{1}}相同。
最后,如果没有对用户提供的int
值进行任何绑定检查,使用input
可能会访问超出绑定的内存,从而导致UB。
FWIW,传递指向a[input]
的指针,而free()
先前未由malloc()
和家族返回,也会调用未定义的行为。
答案 1 :(得分:2)
'a'在堆栈上分配,因此无需释放它。
您只需要释放由<Linear skipoffset="00:00:05">…</Linear>
系列函数分配的变量。
答案 2 :(得分:-1)
malloc接受一个参数 - 要分配的字节数。它返回一个void指针(这是一个指向可以容纳任何数据类型的内存部分的指针)。
这是一个例子。
int *array = malloc(sizeof(int) * 10);
这将分配一个10元素的整数数组。请注意,它会使您的数据未初始化,因此数组的内容未定义。有一个名为calloc的函数, 将其初始化为零。
另外,还有一个样式提示。您可能会尝试将malloc调用的结果转换为指向您将存储在其中的数据类型的指针(例如,int *array = (int *)malloc(sizeof(int) * 10);
。由于this中解释的原因,C程序员不赞成这种做法。交。