【问题标题】:Allocating and initialising a pointer in C在 C 中分配和初始化指针
【发布时间】:2014-09-10 23:37:17
【问题描述】:

所以,我对 C 中的指针不熟悉。

我正面临着困惑。 如果有的话,

int a;

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

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

char * a;

我需要为指针分配内存吗?

其次,我编写了这段代码,

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

为什么我在这段代码中遇到了段错误?是因为我没有为指针分配内存吗?但是正如上面问题中所问的,我也可以简单地声明它,而无需手动分配内存。

PS:我是指针新手,对此我感到困惑。如果这是一个不好的问题,请饶了我。谢谢。

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

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

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

【问题讨论】:

  • 你不需要为指针分配空间,而是为pointee
  • int a 放置在堆栈上,但不是由编译器放置。这是由系统完成的。 char * a 创建一个内存地址,它可能指向也可能不指向良好的内存。您必须 malloc 分配此内存以准备读取/写入。否则,您将冒险进入未定义的行为领域。您的 seg 错误是由于在准备好使用内存之前使用内存造成的。
  • 一个是分配内存,另一个是与该内存关联的变量指向什么。因此,当我声明 char * a 时,系统只分配 4 个字节并将该内存命名为 a 但它没有初始化到任何位置。我这样说对吗?
  • 阅读 C dynamic memory allocation 上的 wikipage,并花几个小时阅读有关 C 编程的更多信息。

标签: c pointers


【解决方案1】:

您不需要为指针本身分配内存。这是自动的,就像您的第一个代码 sn-p 中的 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;
}

【讨论】:

  • 完美。我得到了它。我要做的是通过取消引用实际上是错误的NULL 指针来存储值100。非常感谢:)。
  • 感谢您回答这样一个基本问题。我知道这是一个非常糟糕的怀疑。再次感谢。 :)
【解决方案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;
    }

【讨论】:

    【解决方案3】:

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

    在你的例子中

    int *s=NULL; //this line
    

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

    看到这个小sn-p

    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 意味着指针没有指向任何数据(因为它没有有效地址,零不是有效地址)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 2016-12-11
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多