【发布时间】:2017-03-22 18:49:59
【问题描述】:
抱歉,有很多类似的问题,但我就是不知道我做错了什么(业余警告!)。
我正在尝试在一个函数中填充两个数组,然后将信息返回到 main。我在 main 中声明了数组,但需要在函数中为它们分配内存(计算出它们应该有多大)。虽然数组看起来填充得很好,我可以从函数中打印它们,但当我尝试从 main 打印它们时出现分段错误。
我尝试在这个简化的程序中使用填充一个数组的函数进行故障排除 - 它有同样的问题。我想我在填满我的指针 - 我做错了什么?这是代码和输出:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
void *make_v(double num, double *v)
{
int i;
v = (double *)calloc(5,sizeof(double));
for (i=0; i<5; i++) {
num += 5;
v[i] = num;
}
printf("IN: ");
for (i=0; i<5; i++)
printf("%lf ", v[i]);
printf("\n");
}
main(int argc,char **argv)
{
double *v=NULL;
double num=10.0;
int i;
make_v(num, v);
printf("OUT:\nv:[");
for (i=0; i<5; ++i) {
printf("%lf ", v[i]);
}
}
这输出: 输入:15.000000 20.000000 25.000000 30.000000 35.000000 出去: 分段错误
如果有什么不同的话,我正在 linux 中编码......
希望有人能帮忙,谢谢!
【问题讨论】:
-
我会更改 make_v 以返回一个双 *,然后在最后返回 v。去掉第二个参数。
-
如果你传入一个
double *指针,你可以改变它指向的位置,但你不能改变它指向的位置,因为地址是按值传递的。如果您想更新它指向的位置,您需要像这样传递double **:void make_v(double num, double **v){...} int main(){... double *v=NULL; ... make_v(num, &v); ... } -
一般不要投射
calloc&朋友或void *的结果。并且不要在没有需要的情况下使用void *! -
嗨,JerryJeremiah - 很抱歉,我一直在关注你,但是我现在如何分配和填写 v 函数?
-
嗨 Bruceg - 是的,这会更整洁,但这是一个故障排除功能。我的真实函数有 6 个参数,填充两个数组并返回一个 int ......所以不幸的是,这不是一个选项。
标签: c arrays function pointers