c程序中的分段错误(堆芯转储)

c程序中的分段错误(堆芯转储),c,gcc,ubuntu-14.04,C,Gcc,Ubuntu 14.04,我在ubuntu 14.04 LTS上使用gcc编译器编译以下c程序 #include<stdio.h> void main() { int *a,*b; *a=2; *b=3; printf("\n printing address.....\n address of a = %d \n address of b = %d \n",a,b); printf("\n\n pr

我在ubuntu 14.04 LTS上使用gcc编译器编译以下c程序

    #include<stdio.h>
    void main()
    {
        int *a,*b;
        *a=2;
        *b=3;
          printf("\n printing address.....\n address of a = %d \n address of b = %d \n",a,b);
         printf("\n\n printing values ..... \n value of a = %d \n value of b = %d \n",*a,*b);
      }
请指出我哪里做错了。
谢谢

您正在声明和使用指向内存的指针,而没有为它们分配空间

只是宣布:

int *a;
不会给您使用的内存,这只是声明了一个可以引用内存的变量

指针一旦被声明,将被取消初始化,并将指向不属于您的内存部分。使用这种记忆——在你的例子中,把一个值放在那里——将导致未定义的行为;当你触摸内存时,你会看到一个内核转储

为了获得一些可用空间,请了解malloc:


当您声明一个指针时

int* p; 
它与声明整型变量类似:

int v;
v的内容未初始化-与p相同-它也未初始化,因此当您使用p例如*p时,您可能会在内存中的任何位置取消对地址的引用,即使在只读内存中也是如此。相反,您需要初始化变量

int v = 0;
int* p = &v;  // p points to v in memory 

INTA,B;int*a=&a,*b=&b;voidmain是错误的,顺便说一句。main返回int。总是用gcc-Wall-Weror编译代码。这将防止你犯这样愚蠢的错误。也是学习如何使用gdb的时候了。。。。gdb./mypgram和r。您不能只为指针分配任意值。我想你需要定义整数,然后用&a和&b来引用它们的地址。如果你问这个问题,这意味着你真的需要学习C课程或书籍,或者转换到另一种语言上面的答案是完全正确的。或者他可以通过艰苦的方式学习:-提问、谷歌搜索和点击错误。需要更长的时间,但这会让你达到目的,或者让你想读更多的东西。从示例中不清楚将指针设置为NULL是一个好方法的原因。您不想冒着被随机初始化为伪值的风险,尝试释放或访问它。释放NULL是无害的,但释放非合法地址值是严重的错误。因此,最佳做法是在指向的地址释放内存后将指针设置为NULL,这样以后就不会试图访问释放的内存,从而导致崩溃。通过以这种方式处理指针,通过将指针与NULL进行比较,您可以始终知道指针是否引用了有效内存。会救你很多钱headaches@nerdistcolony我认为在本例中这可能太详细了,但我已经用更多可能对初学者有用的内容修改了代码示例。我没有以任何方式批评你的文章,只是对其进行了修改。你对它的更新很好。
int v;
int v = 0;
int* p = &v;  // p points to v in memory