具有副作用的功能

时间:2019-05-23 23:54:51

标签: c function

我是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);
}

1 个答案:

答案 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”指向的地址。