你好我有这个代码,当它到达第二个printf时有一个错误编译器...我认为这是关于函数的指针* y
#include <stdlib.h>
#include<stdio.h>
int *x,*y;
void duplicate(int*x,int *y,int elem){
int j;
y=(int*)malloc(elem*sizeof(int));
for(j=0;j<elem;j++){
y[j]=x[j];
x[j]=x[j]+1;
}
}
int main(){
int j;
y=(int*)malloc(2*sizeof(int));
*y=10;*(y+1)=50;
duplicate(y,x,2);
printf("the poin y con y[0]=%d and y[1]=%d\n",y[0],y[1]);
printf("the poin y con x[0]=%d and x[1]=%d\n",x[0],x[1]);
return 0;
}
答案 0 :(得分:1)
在函数y
中为x
(全局duplicate()
)分配内存时,它不会更新全局x
,因为y
是duplicate()
中的局部变量。
您不需要从x
传递main()
因为它是全局变量。如果做需要传递,则将指针传递给指针以更新它:
duplicate(y,&x,2);
并更新函数duplicate()
以使用*y
:
*y=malloc(elem*sizeof(int));
等等。
<强>建议:强>
malloc
的返回值为dangerous。x
是一个全局变量,但是您将它传递给函数但在那里调用y
。int main(void)
。答案 1 :(得分:0)
您的问题是您在y
内更改指针duplicate
的内存地址。
当您将指针传递给函数时,该指针的副本将作为函数中的局部变量创建。它仍指向相同的int
,因此如果取消引用指针并更改整数的值,则从函数返回时将保留该新值。但是,如果更改指向的内存地址(与malloc
一样),则仅更改指针的本地副本,并且全局变量y
仍指向一些未分配的地址,可能包含垃圾或导致分段错误。
要解决此问题,您可以将指针传递给指针 - 即int** y
,或者您可以重复返回新的内存地址:
int * duplicate(int*x,int *y,int elem){
int j;
y=(int*)malloc(elem*sizeof(int));
for(j=0;j<elem;j++){
y[j]=x[j];
x[j]=x[j]+1;
}
return y;
}
然后在main()
中将其命名为:
x = duplicate(y,x,2);
当然,没有实际的理由将目标指针传递给duplicate
函数,因此您可以将其简化为:
int * duplicate(int*x,int elem){
int j;
int *y;
y=(int*)malloc(elem*sizeof(int));
for(j=0;j<elem;j++){
y[j]=x[j];
/* I'm not sure why you have this line here, bug? */
x[j]=x[j]+1;
}
return y;
}
然后将其称为:
x = duplicate(y,2);