什么都行不了 - 引用,指针

时间:2013-04-06 13:45:21

标签: c

void load(int *n, int *x, int **arr)
{   
    arr = (int**)malloc(sizeof(int*)*(*n));
    for(int i = *n; i >= 0; i--)
    {
        scanf("%d", &arr[i]);
    }
}

int main()
{
    int n = 0, x = 0;
    int *arr;

    load(&n, &x, &arr);

    printf("%d", arr[1]);

    return EXIT_SUCCESS;
}

程序编译正确,但在main函数的printf()期间抛出了Windows错误。只显示“arr”会给出随机的大数字。这有什么不对?

2 个答案:

答案 0 :(得分:1)

arr = (int**)malloc(sizeof(int*)*(*n));

不会更改main中的任何内容,它只会覆盖arr收到的指针副本(mainload的地址)。

该函数应该做的是更改arr中的main,为此,您必须取消引用该参数,

*arr = (int*)malloc(sizeof(int)*(*n)); // cast for C++ compiler left in

更改arrmain的值。 (arr的参数load所指向的对象,即arr中的main,需要更改,因此您需要修改*arr in load。)

然后扫描

scanf("%d", &(*arr)[i]);

或(等效)

scanf("%d", *arr + i);

答案 1 :(得分:-1)

#include <stdio.h>
#include <stdlib.h>
void load(int *n, int *x, int **arr)
{   
    int i = 0;
    *arr = (int*) malloc(*n * sizeof(int));
    if(!*arr) {
        perror("Can not allocate memory!");
        return;
    }
    for(i = *n; i >= 0; i--)
    {
        scanf("%d", *arr + i);
    }
    return;
}

int main()
{
    int n = 0, x = 0;
    int *arr;
    int i;

    /* You probably need to initialize n */
    n = 5;
    load(&n, &x, &arr);

    for(i = n; i >= 0; i--)
    {
        printf("%d - %d\n", i, arr[i]);
    }
    return EXIT_SUCCESS;
}