在C中分配和初始化指针

在C中分配和初始化指针,c,pointers,C,Pointers,所以,我不熟悉C语言中的指针 我面临着困惑。 如果我有 int a; 在这里,我不会手动为a分配内存。它是由编译器自动完成的 现在,如果以类似的方式,如果我这样做 char * a; 我需要为指针分配内存吗 第二,我做了这个代码 #include <stdio.h> int main (void) { int *s=NULL; *s=100; printf("%d\n",*s); return 0;

所以,我不熟悉C语言中的指针

我面临着困惑。 如果我有

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

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

char * a;
我需要为指针分配内存吗

第二,我做了这个代码

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

这并不能真正解决我的疑问。

您不需要为指针本身分配内存。这是自动的,就像第一个代码片段中的
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;
}
#包括
#包括
内部主(空)
{
int*s=NULL;//s被创建为NULL指针,不指向任何内存
s=malloc(sizeof(int));//分配一个int值的内存
*s=100;//将int值100存储在分配的内存中
printf(“%d\n”,*s);//读回内存
释放;//释放内存
//(在此之后,如果没有
//使其先指向有效内存)
返回0;
}

您必须为要声明的变量分配内存。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;
     }
#包含int main(无效)
{
int*s=NULL;
s=(int*)malloc(sizeof(int));
*s=100;
printf(“%d\n”,*s);
返回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;
    }
#包括
内部主(空)
{
int*s=NULL;
int-var;
s=&var;
*s=100;
printf(“%d\n”,*s);//100
printf(“%d\n”,var);//也是100
返回0;
}

指针也是存储其他变量地址的特殊类型的变量,因为地址也是某个值(数字),因此也需要内存来存储此地址,所以当您使用
malloc()分配内存时,编译器会自动将内存(32位机器上正好是4个字节)分配给指针变量或者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意味着指针没有指向任何数据(因为它没有有效地址,零不是有效地址).

您不需要为指针分配空间,而是为指针对象分配空间。
int a
放在堆栈上,但不是由编译器放置的。这是由系统完成的
char*a
创建一个可能指向或可能不指向良好内存的内存地址。您必须malloc此内存以准备读/写。否则,你就是在冒险进入一片无人居住的土地。seg故障是由于在内存准备就绪之前使用内存造成的。一个是分配内存,另一个是与该内存关联的变量指向什么。因此,当我声明
char*a
时,系统只分配4个字节,并将该内存命名为
a
,但它没有初始化到任何位置。我说的对吗?请阅读上的wikipage,花几个小时阅读更多关于C编程的内容。完美。我得到了它。我试图做的是通过取消引用实际上是错误的
NULL
指针来存储值
100
。非常感谢:)。谢谢你回答这么一个基本的问题。我知道这是一个非常糟糕的怀疑。再次感谢。:)
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;
}