我是C语言的初学者,试图实现一个返回值但还通过指针将数组更改为副作用的函数。我知道我应该在最后释放所有内存,但这超出了这里的主题。
我的编译器说设备上没有剩余空间,并发出“ collect2:error:ld返回1退出状态”的信号。这与指针有关还是我在函数本身中出错了?
int load(int *a) {
int i,n;
printf("Input the number of elements ");
scanf("%d", &n);
a=malloc(n*sizeof(int));
printf("Input the elements ");
for(i=0;i<n;i++)
scanf("%d ",a+i);
return n;
}
int add(int *a, int n) {
int sum=0, i;
for(i=0;i<n;i++)
sum+=*(a+i);
return sum;
}
int main() {
int *a,n1,z1;
n1=load(a);
z1=add(a,n1);
printf("Sum of the array is %d", z1);
}
答案 0 :(得分:2)
您的代码中存在逻辑错误
int *a,n1,z1;
在主函数变量'a'中是一个指针变量。
这是一个局部变量,未分配给任何地址。
它指向某个随机地址。(假设指针指向地址0x1000)
n1=load(a);
这里只传递了指针的值。
即传递0x1000并将其分配给函数加载的另一个局部变量'a'。
a=malloc(n*sizeof(int));
malloc返回动态分配的地址。
=>作为参数传递的值丢失,并且本地指针变量'a'中存在动态分配的新值。
scanf("%d ",a+i);
所有输入元素都分配给动态分配的地址,而不是地址0x1000
z1=add(a,n1);
这里再次将指向某个随机地址的主函数指针变量'a'作为第一个参数而不是动态分配的内存传递。
行为未定义,因为我们不知道主函数指针变量“ a”指向的地址。