0

我对 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;
}

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

4

2 回答 2

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 的结果,请参阅:我要转换 malloc 的结果吗?具体来说, 强制转换 malloc 的结果有什么危险?

于 2012-10-22T19:14:18.490 回答
1

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

或伪代码

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

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

于 2012-10-22T19:13:42.273 回答