C语言指针变量为啥要赋初值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针变量为啥要赋初值?相关的知识,希望对你有一定的参考价值。

比如: PNODE pHead = NULL;
pHead = create_list(); // create_list()返回的是一个指针 PNODE 定义的是一个指针类型;// 我想知道的是为什么这样,而不是你告诉我不能这样,谢谢;)

参考技术A 因为指针不初始赋值的话会随机分配一个内存地址,如果后面的代码直接使用的话会出错,C编译器为了不让这种情况发生所以去检测有没有不初始化的指针,其实就是编译器搞得鬼。 参考技术B 不给指针变量赋初值在语法上是没有错误的,编译执行也可以通过,但是一旦代码量增多后,很容易造成指针的错用,为了防止这一问题最好将指针变量定义的时候就置成NULL,这样做是为了代码安全着想。 参考技术C 这样可以我当初也是你的想法,但一旦指针多了或工程很大就会忘记了哪个指针没有赋初值然后引用了不改引用的地方而且更悲惨的是:程序有时不抱错,因为这样做可以,语法方面完全正确,完全匹配给了NULL一但更改了地质为NULL的地方,系统会报错,说你不该引用地址为NULL的地方个人观点...... 参考技术D 使用指针必须要初始化,要有一个明确的指向是有目的性的。之后再移动更改才不会造成混乱

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

#include<stdio.h>
struct st

int num;
st1 = 1 , st2;
struct st1*pst1;
pst1 = &st1;//这一行为什么放在main外面,下面的pst1->num的pst1不会有下波浪线报错(我用的vs2017)
void main()
printf("%d", pst1->num);

struct st1*pst1; //问题在这句,这个指针pst1指向的类型是st1,而不是st,所以pst1 = &st1是不可以的,自然 pst1->num也就不对了
#include<stdio.h>
struct st

int num;
st1 = 1 , st2;
struct st*pst1; //是st*,而不是st1*

void main()
pst1 = &st1; //放在局部,全局区是不能赋值的
printf("%d", pst1->num);
追问

请问是不是说struct st这个st如果不定义的话,结构体指针要想定义就必须用typedef定义结构体是这个意思把?

追答

struct st 的意思是定义了一个叫st的类型

struct st

int num;
st1 = 1 , st2; //这个就是定义了两个st类型的变量,这两个变量名叫st1,st2
struct st* pst1; // 定义了一个指向st类型变量的指针
struct st1* pst1; // 定义了一个指向st1类型变量的指针,你的代码里不存在st1类型
pst1 = &st1 //st1的类型是st,所以&st1的类型就是st* , 而不是st1*

就像int一样
int int1; //int是类型,int1是int类型的变量

参考技术A 赋值语句属于执行语句,必须写在函数体里,不能写在全局区。追问

但是写在主函数里会有这样的错误提示啊:
printf()里的“num”的左侧部分指定未定义的结构/联合“st1”

追答

struct st1*pst1;
这一行应该是struct st *pst1;

参考技术B

类型和变量名是不同的,要区分开来

以上是关于C语言指针变量为啥要赋初值?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?

c++中定义一个变量一定要赋初值吗

在c语言里怎么把第一个变量的值赋给第二个变量

c语言如何通过函数来改变已经赋初值的全局变量的值?

有关C语言指针的问题:为啥最后结果是空指针?