我试图声明一个整数变量 m 和一个指向整数数据类型 n 的指针。
int m,*n;
*n=2;
printf("%d",*n);
上面的代码工作正常。但
int *n,m;
*n=2;
printf("%d",*n);
给出分段错误。
请解释为什么?
我试图声明一个整数变量 m 和一个指向整数数据类型 n 的指针。
int m,*n;
*n=2;
printf("%d",*n);
上面的代码工作正常。但
int *n,m;
*n=2;
printf("%d",*n);
给出分段错误。
请解释为什么?
两个版本都是错误的——你只是幸运地遇到了那个有效的版本。您已经声明了一个指针,但没有为它分配任何存储空间。尝试这个:
int *n,m;
n=&m;
*n=2;
printf("%d",*n);
或使用malloc()
:
int *n;
n=malloc(sizeof(int));
*n=2;
printf("%d",*n);
free(n);
当你声明一个指针变量时,它会在内存中分配一些空间块。这个空间已经包含了一些在这个程序之前用于任何用途的数据。它给出了分段错误,因为指针中的任何数据都指的是硬盘驱动器空间之外的内存位置。正如 Armen 所说,您必须通过告诉指针指向的位置来初始化指针。这会将当前指针中的数据替换为变量 m 的地址(或您希望它指向的任何位置)。
n 是未初始化的指针。访问它会导致错误。
你很幸运,第一个工作。他们都在访问一个未初始化的指针。
“n”指的是什么?由于它是未初始化的,它没有指向任何东西。在每种情况下,您都在分配 n 指向 2 的值。第一个最终会导致一个讨厌的错误。第二个你很幸运,因为它马上就崩溃了。
使用 malloc 为 n 创建一些内存指向,然后分配它。