#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;
}
答案 0 :(得分:6)
int* t;
仅声明一个指向int
的指针;但是t
并不指向int
(与a
和b
不同)。
因此*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中的本地指针时为什么会出错
我不确定该错误是什么意思。是分段错误还是交换功能的某些意外行为?简而言之,请回答deferencing
和uninitialised 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;)的前一种方法适合您的要求,并且将是适用于您的应用程序的有效方法。但是,我仍然提到了使用动态分配的指针的方法,以使您了解使用指针的情况。