C中的分段错误尝试使用指针交换两个值

Gau*_*rav 3 c swap pointers segmentation-fault

我试图尝试在两个变量中交换值时遇到分段错误.我的代码是:

void swap(int *a,int *b){
    int *temp;
    *temp=*a;
    *a=*b;
    *b=*temp;
}
int main(){
    int i=1,j=0;
    printf("Before %d,%d\n",i,j);
    swap(&i,&j);
    printf("After %d,%d\n",i,j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Before 1,0
After 0,1
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

对我来说神秘的是在成功交换值后产生错误.什么是虫子?我需要在任何地方对指针进行类型转换吗?

Ily*_*lya 11

你的指针int *temp;什么都没有.

因此,当您的程序执行时*temp=*a;,它会将值a放入随机内存块中.

试试这个修复:

void swap(int *a,int *b){
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
Run Code Online (Sandbox Code Playgroud)

更新:

附加问题:

假设我想使用temp作为指针变量而不是常规变量,有没有办法让我的程序执行或者我需要离开我的固执?

答:你可以试试这个:

void swap(int *a,int *b){
    int *temp;
    temp = malloc(sizeof(int));
    if (temp == NULL)
      return;
    *temp=*a;
    *a=*b;
    *b=*temp;
    free(temp);
}
Run Code Online (Sandbox Code Playgroud)

  • @Gaurav好的,但请记住,通常只有两个很好的理由使用m/c/realloc():1)当你在编译时不知道你的变量/数组的大小,或2)当你需要一个足够大的内存,它可能会炸毁堆栈,你不需要全局或静态的内存持续时间. (2认同)