1

我试图声明一个整数变量 m 和一个指向整数数据类型 n 的指针。

int m,*n;
*n=2;
printf("%d",*n);

上面的代码工作正常。但

int *n,m;
*n=2;
printf("%d",*n);

给出分段错误。

请解释为什么?

4

5 回答 5

7

两个版本都是错误的——你只是幸运地遇到了那个有效的版本。您已经声明了一个指针,但没有为它分配任何存储空间。尝试这个:

int *n,m;
n=&m;
*n=2;
printf("%d",*n);

或使用malloc()

int *n;
n=malloc(sizeof(int));
*n=2;
printf("%d",*n);
free(n);
于 2011-06-15T18:56:19.340 回答
4

两个代码段都调用未定义的行为,因为您取消引用未初始化的指针。当有 UB 时,鼻恶魔从你的鼻子里飞出来……或者你的程序点了披萨,或者它崩溃了,或者它工作了……你必须先分配内存。

int* n = malloc(sizeof(int));
*n = 2;
free(n);

或者将其设置为另一个对象的地址;;

int *n, m;
n = &m;
*n = 2;
于 2011-06-15T18:55:43.657 回答
1

当你声明一个指针变量时,它会在内存中分配一些空间块。这个空间已经包含了一些在这个程序之前用于任何用途的数据。它给出了分段错误,因为指针中的任何数据都指的是硬盘驱动器空间之外的内存位置。正如 Armen 所说,您必须通过告诉指针指向的位置来初始化指针。这会将当前指针中的数据替换为变量 m 的地址(或您希望它指向的任何位置)。

于 2011-06-15T19:04:49.053 回答
0

n 是未初始化的指针。访问它会导致错误。

于 2011-06-15T18:56:36.203 回答
0

你很幸运,第一个工作。他们都在访问一个未初始化的指针。

“n”指的是什么?由于它是未初始化的,它没有指向任何东西。在每种情况下,您都在分配 n 指向 2 的值。第一个最终会导致一个讨厌的错误。第二个你很幸运,因为它马上就崩溃了。

使用 malloc 为 n 创建一些内存指向,然后分配它。

于 2011-06-15T18:58:02.860 回答