【问题标题】:pointers & pointer to pointer in CC中的指针和指向指针的指针
【发布时间】: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 指针。只有当指针已经指向某个有效的地方时才能做到这一点。事实上,*q1q1[0]完全相同
  • 在第二种情况下*q1 = NULL,您将NULL分配给内存中的某个随机位置。行为将是未定义的,也可能导致 Segfault。还有一件事*p1,C 不支持数组绑定检查,因此您的循环也可能最终显示出一些奇怪的行为。
  • 作为了解指针工作原理的一种快速简单的方法,请准备一支笔和一些纸。然后为p画一个长框,把它分成11部分。从每个部分绘制箭头并以数组中的字符串结束它们。现在绘制三个新框,并将它们标记为p1d1q1。将箭头绘制到它们指向的位置(即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实际上指向的地方是有效的(可能是通过使用地址或指针运算符&amp;来创建指向指针变量的指针)。

标签: c pointers double-pointer


【解决方案1】:

在您的第一个代码中,q1 = NULL; 行将零(空)值分配给指针 q1,这是一个完全有效的操作(即使该指针可能指向另一个指针)。实际上,将NULL 值分配给指针是一种常用技术,用于测试该指针当前是否包含有效地址(如果是NULL,则不能使用它) .

在您的第二个代码*q1 = NULL; 中,您尝试将零分配给q1 指向的对象(本身就是一个指针);但是,q1 没有被分配一个值(地址),因此它没有指向任何有效的目标,并且您的尝试失败(因为您正在尝试修改您可能不使用的内存的“随机”部分'无权访问)。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多