函数中的Init数组

时间:2012-10-22 19:11:07

标签: c arrays pointers

我是C的新手,我试图在函数中初始化一个数组。

但它不起作用,因为如果我想在main方法中打印值,我总是会遇到分段错误。

 static void array(int *i)
{
    int j = 0;
    i = (int *) malloc(5 * sizeof (int));
    for (j = 0; j < 5; j++) {
        i[j] = j;
    }

    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", i[j]);
    }
}

/* Main entry point */
int main(int argc, char *argv[])
{
    int j;
    int *i = NULL;

    array(i);
    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", i[j]);
    }
    return 0;
}

如果有人可以修复代码并解释它是如何工作的,那会很好。

2 个答案:

答案 0 :(得分:3)

static void array(int **i)
{
    int j = 0;
    *i = malloc(5 * sizeof (int));
    for (j = 0; j < 5; j++) {
        (*i)[j] = j;
    }

    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", (*i)[j]);
    }
}

/* Main entry point */
int main(int argc, char *argv[])
{
    int j;
    int *i = NULL;

    array(&i);
    for (j = 0; j < 5; j++) {
        printf("Hello: %d\n", i[j]);
    }
    return 0;
}

您正在按值将指针传递给数组,因此您需要做的是将指针传递给指针,然后设置/使用它。


至于为何不应该转换malloc的结果,请参阅:Do I cast the result of malloc?Specifically, what's dangerous about casting the result of malloc?

答案 1 :(得分:1)

为了从函数内部向变量分配内存,必须将指针作为函数参数传递给指针,取消引用指针然后分配内存。

或伪代码

function(int **i)
{
    *i = malloc...
}
int *i = NULL;
function(&i);

这是实现目标的方法之一。您还可以返回malloc返回的指针。 而且,从我读过的材料来看,最好不要转换malloc的返回类型。