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”会给出随机的大数字。这有什么不对?
答案 0 :(得分:1)
arr = (int**)malloc(sizeof(int*)*(*n));
不会更改main中的任何内容,它只会覆盖arr
收到的指针副本(main
中load
的地址)。
该函数应该做的是更改arr
中的main
,为此,您必须取消引用该参数,
*arr = (int*)malloc(sizeof(int)*(*n)); // cast for C++ compiler left in
更改arr
中main
的值。 (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;
}