错误的内存重复

时间:2015-06-20 12:43:13

标签: c

你好我有这个代码,当它到达第二个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;
    }

2 个答案:

答案 0 :(得分:1)

在函数y中为x(全局duplicate())分配内存时,它不会更新全局x,因为yduplicate()中的局部变量。

您不需要从x传递main()因为它是全局变量。如果需要传递,则将指针传递给指针以更新它:

duplicate(y,&x,2);

并更新函数duplicate()以使用*y

*y=malloc(elem*sizeof(int));

等等。

<强>建议:

  1. 在C中投射malloc的返回值为dangerous
  2. 不要像在此处那样混淆变量名称。 x是一个全局变量,但是您将它传递给函数但在那里调用y
  3. 使用main()的标准签名,例如: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);