【发布时间】:2021-08-14 21:28:13
【问题描述】:
嘿,我正在尝试理解指针,但我注意到一些导致程序中未定义行为的东西 在第一种情况下,当我将指向 q1 的指针衰减为 NULL 时,一切都很好,但是当我将指针 *q1 衰减为 NULL 时 终端不显示任何东西。出了什么问题?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main ()
{
char *p[11]={"vasilis","loukas","vasilis","vasilis","giorgos","makis","vasilis","nikos","makis","nikos"};
char **p1;
char**d1;
char**q1;
q1=NULL;
p1=&p[0];
d1=&p[1];
/******Count words*********/
int count=0;
for(p1=&p[0] ; *p1 ; p1++)
{
count++;
}
printf("\nthe number of words : %d" ,count);
return 0;
}
第二种情况:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main ()
{
char *p[11]={"vasilis","loukas","vasilis","vasilis","giorgos","makis","vasilis","nikos","makis","nikos"};
char **p1;
char**d1;
char**q1;
*q1=NULL;
p1=&p[0];
d1=&p[1];
/******Count words*********/
int count=0;
for(p1=&p[0] ; *p1 ; p1++)
{
count++;
}
printf("\nthe number of words : %d" ,count);
return 0;
}
【问题讨论】:
-
您不会“衰减”指向
NULL的指针,而是将NULL分配给指针(就像将整数值分配给int变量一样) .*q1取消引用q1指针。只有当指针已经指向某个有效的地方时才能做到这一点。事实上,*q1与q1[0]完全相同。 -
在第二种情况下
*q1 = NULL,您将NULL分配给内存中的某个随机位置。行为将是未定义的,也可能导致 Segfault。还有一件事*p1,C 不支持数组绑定检查,因此您的循环也可能最终显示出一些奇怪的行为。 -
作为了解指针工作原理的一种快速简单的方法,请准备一支笔和一些纸。然后为
p画一个长框,把它分成11部分。从每个部分绘制箭头并以数组中的字符串结束它们。现在绘制三个新框,并将它们标记为p1、d1和q1。将箭头绘制到它们指向的位置(即p1应该有一个指向p[0]的箭头)。对于赋值q1 = NULL(注意no 解引用操作符)在空白处画一个箭头并标记为NULL。对于第二个示例,不要为“q1”画一个箭头,因为它没有指向任何地方。希望对您有所帮助。 -
@Someprogrammerdude 好的,我明白你的意思,但为什么在这里 geeksforgeeks.org/linked-list-set-2-inserting-a-node/?ref=lbp 在这种情况下:/* 给定一个指向列表头部的引用(指向指针的指针)和一个 int,追加一个新节点最后 */ 我可以分配 if (*head == NULL) 我知道这是完全不同的项目,但为什么在这种情况下我可以分配 NULL?
-
那么
head实际上指向的地方是有效的(可能是通过使用地址或指针运算符&来创建指向指针变量的指针)。
标签: c pointers double-pointer