所以,我是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
它并没有真正解决我的疑问。
答案 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不是有效地址)。