0
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;
}

该程序可以正确编译,但在printf()in main 函数期间会引发 windows 错误。仅显示“arr”会给出随机的大数字。这里有什么问题?

4

2 回答 2

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

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

该函数应该做的是改变arrmain为此,您必须取消引用参数,

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

更改arrin的值main。( 的参数指向的对象,即arrin ,需要更改,因此您需要修改in 。)loadarrmain*arrload

然后扫描应该是

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

或同等学历)

scanf("%d", *arr + i);
于 2013-04-06T13:48:31.480 回答
-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;
}
于 2013-04-06T14:03:58.347 回答