将参数发送的指针的值分配给C中的本地指针时,为什么会出错

时间:2018-08-11 16:39:59

标签: c pointers

#include <stdio.h>

void ref(int *a,int *b) {
    int *t;
    *t = *a;
    *a = *b;
    *b = *t;
}

int main() {
    int a = 2, b = 3;
    ref(&a, &b);
    printf("a=%d,b=%d", a, b);
    return 0;
}

3 个答案:

答案 0 :(得分:6)

int* t;仅声明一个指向int的指针;但是t并不指向int(与ab不同)。

因此*t的行为是未定义

在您的特定情况下,int t;就足够了,随后的代码更改为t = *a等。

答案 1 :(得分:6)

int *t;这样声明指针不会创建任何内存,这意味着t没有指向任何内容,访问*t = *a;将给出未定义的行为。 在您的情况下,您不需要指针来交换两个变量,而只需要普通变量即可。

void ref(int *a,int *b){    
   int t;
   t=*a;
   *a=*b;
   *b=t;
}

答案 2 :(得分:-1)

  

为什么将参数发送的指针的值分配给C中的本地指针时为什么会出错

我不确定该错误是什么意思。是分段错误还是交换功能的某些意外行为?简而言之,请回答deferencinguninitialised pointer,这是程序意外行为的原因。

在函数t中声明的本地指针ref具有automatic storage class

在代码块(在您的情况下,在函数ref中)中用C声明的所有变量具有自动存储类,具体取决于 默认。未初始化的自动变量的值不确定 直到为其分配了有效的类型值。

因此,指针t具有未定义的值,并且将存储一些垃圾值。您可以尝试打印指针t的值。

printf("Value of the pointer is %p\r\n", t);

要在C中使用指针,以存储值并从中检索值(取消引用),则指针变量应指向valid memory location。否则,您将得到意外的行为,并且程序可能会因分段错误而崩溃。

为确保变量t指向特定的有效内存位置,可以使用以下两种方法之一。

使用具有自动存储类的变量。

void ref(int *a, int *b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}

使用动态分配的内存位置

void ref(int *a, int *b)
{
    int *t = malloc(sizeof(int));
    *t = *a;
    *a = *b;
    *b = *t;

    free(t); // Free the memory allocated dynamically
 }

使用automatic variable(int t;)的前一种方法适合您的要求,并且将是适用于您的应用程序的有效方法。但是,我仍然提到了使用动态分配的指针的方法,以使您了解使用指针的情况。