未初始化的指针会导致核心转储

时间:2014-09-10 04:03:49

标签: c cygwin

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc,char **argv)
{
  int x[3] = {42, 44, 48};
  int *y;
  int *z;
  z=y;
  y=x;

  printf("%d, %d, %d\n", x[0], x[1], x[2]);
  printf("%d, %d, %d\n", y[0], y[1], y[2]);
  printf("%d, %d, %d\n", z[0], z[1], z[2]);

  return 0;
}

当我尝试编译上面的代码时,我收到了错误消息

tester.c: In function ‘main’:
tester.c:15:2: warning: ‘y’ is used uninitialized in this function [-Wuninitialized]
z=y;
 ^

和编译结果后的printf结果显示核心转储的Z行。我不确定我做错了什么,因为我之前已经完成了对数组的指针,并且它没有导致核心转储。

编辑:问题已得到解答。 z = y和y = x的反向顺序。

3 个答案:

答案 0 :(得分:2)

正如所建议的那样(虽然BLUEPIXY也给出了相同的核心信息,因此CW答案)。

您的zy分配顺序错误。您将未初始化的值分配给z,然后设置y。如果您先设置y,然后将结果复制到z,则可以避免出现问题。

注意编译器的警告是很好的。请记住,特别是在你学习的时候,它对你的了解比你更多。

答案 1 :(得分:1)

最初,y和z都未初始化。这就是为什么 当你设置z = y时你得到警告(y在这里未初始化)。 现在设置y = x并不会改变z的值(仍未初始化)。 所以最终你试图访问一个未初始化的指针(z) 这就是获得错误的原因。

答案 2 :(得分:0)

包含以下头文件

#include <stdlib.h>

将内存分配给y

int x[3] = {42, 44, 48};
int *y;
int *z;
y=(int *) malloc (3 * sizeof (int));
z=y;
y=x;

从主要回归之前记得释放内存

free (y);

这应该可以正常工作。