在C中分配和初始化指针

时间:2014-07-20 08:09:39

标签: c pointers

所以,我是C的新手。

我正面临困惑。 如果我有,

int a;

在这里,我不为手动分配内存。它由编译器自动完成。

现在,如果以类似的方式,如果我这样做,

char * a;

我是否需要为指针分配内存?

其次,我制作了这段代码,

#include <stdio.h>
int main (void)
    {
        int *s=NULL;
        *s=100;
        printf("%d\n",*s);
        return 0;
    }

为什么我在此代码中出现seg错误?是因为我没有为指针分配内存吗?但正如上面提到的那样,我可以简单地声明它,而无需手动分配内存。

PS:我是指针新手,我在这方面面临困惑。如果这是一个糟糕的问题,请保管我。感谢。

编辑:我在SO上阅读了malloc的帖子。

http://stackoverflow.com/questions/1963780/when-should-i-use-malloc-in-c-and-when-dont-i

它并没有真正解决我的疑问。

3 个答案:

答案 0 :(得分:6)

您不需要为指针本身分配内存。这是自动的,就像您的第一个代码段中的int一样。

你需要分配的是指针指向的内存,你需要初始化指针指向它。

由于您没有分配任何空间,*s=分配是未定义的行为。 s本身(指针)已分配,并初始化为NULL。您无法解除引用(*s - 查看指针指向的内容)空指针。

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

int main (void)
{
    int *s = NULL; // s is created as a null pointer, doesn't point to any memory
    s = malloc(sizeof(int)); // allocate one int's worth of memory
    *s = 100;                // store the int value 100 in that allocated memory
    printf("%d\n",*s);       // read the memory back
    free(s);                 // release the memory
                             // (you can't dereference s after this without
                             //  making it point to valid memory first)
    return 0;
}

答案 1 :(得分:2)

您必须为要声明的变量s分配内存。 Malloc是一种很好的方式。使用int * s = NULL时,指针不指向任何地址。然后你试图给该地址赋值(* s = 100;)。如果你不想手动分配内存(使用malloc),你只需声明一个int变量,然后使s指向该变量。

使用malloc:

  #include <stdio.h> int main (void)
     {
         int *s=NULL;
         s=(int *)malloc(sizeof(int));
         *s=100;
         printf("%d\n",*s);
         return 0;
     }

没有malloc:

#include <stdio.h>
int main (void)
    {
        int *s=NULL;
        int var;
        s=&var;
        *s=100;
        printf("%d\n",*s);//100
        printf("%d\n",var);//also 100
        return 0;
    }

答案 2 :(得分:1)

由于指针也是特殊类型的变量,它存储其他变量的地址,因为地址也是一些值(数字),因此存储器也需要存储这个地址,因此编译器会自动分配内存(正好是4个字节) 32位机器)到指针变量,当你使用malloc() or calloc()分配内存时,你实际上是将内存分配给要存储的数据,并简单地将该内存的起始地址分配给指针。

行的示例中
int *s=NULL; //this line

编译器实际分配4个字节的内存(如果你的机器是32位)

看到这个小片段

int main(void)
{
  int *s=NULL;
  printf("%d\n",sizeof(s)); //Will output 4 if you are using is 32-bit OS or else 2 if you are using using 16 bit OS.
  return 0;
}

而NULL只是将零分配给指针的另一种方式。从技术上讲,你实际上使用4个字节在该指针中存储零。并且不要混淆,分配零或NULL表示指针未指向任何数据(因为它没有保存有效地址,Zero不是有效地址)。