gpt4 book ai didi

c - 在函数中使用双指针

转载 作者:行者123 更新时间:2023-11-30 20:00:15 25 4
gpt4 key购买 nike

我目前正在尝试学习如何将链表作为个人项目。我理解核心概念,并且一直在尝试将其实现到c中。我的程序看起来应该可以工作,请记住我对编程还是新手:D

我创建了一个名为 head 的结构体指针。 head将指向linked_list中的第一个节点,startPtr将包含head的地址。每次调用函数add时,都会创建一个新节点,并在内存中分配一些空间,然后先前创建的节点将指向新节点。

我知道我的程序在哪里崩溃,但我知道为什么?它编译得很好。

我的代码上线就崩溃了

(*prevNode)->link = newNode; 

这是我看到这段代码的方式:我将双指针 startPtr 传递到函数 add 中。然后我使用 malloc 创建了一个新节点。接下来我引用startPtr(在函数中称为prevNode),它应该包含head的内存地址......对吗?然后我使用“->”表达式指向头内称为链接的结构指针。

程序到此就结束了,我不知道为什么。我看过其他链表 C 代码,但大多数不使用双指针,它们只是声明全局结构体和指针。我使用 GCC 作为我的编译器。

有人知道为什么会发生这种情况吗?

#include <stdio.h>
#include <stdlib.h>


// STRUCTURES

struct node
{
int data;
struct node *link;
}*head;

void add( int, struct node ** );


int main()
{
struct node *head;
struct node **startPtr;
startPtr = head;
struct node *nodePtr;
int userInput;
int inputData;


do{
printf( "\n\n1: enter new node\n" );
printf( "2: Print Nodes\n" );
printf( "\n\nEnter: " );
scanf( "%d", &userInput );
if ( userInput == 1 )
{
printf( "\n\nEnter data:");
scanf("%d", &inputData );
add( inputData, startPtr );
}

}while( userInput == 1 );

// printing linked list
nodePtr = head->link;
while( nodePtr->link != NULL )
{
printf( "%d\n", nodePtr->data);
nodePtr = nodePtr->link;
}
printf( "%d\n", nodePtr->data);
return 0;

}// END main()

void add( int num, struct node **prevNode )
{
// assigning memory for a new node
struct node *newNode = malloc( sizeof( struct node ) );
(*prevNode)->link = newNode;
newNode->data = num;
newNode->link = NULL;
prevNode = &newNode;
}// END add()

此外,我还有一个问题无法在网上找到并回答。当我创建指向结构体的指针时,例如结构节点 *ptr;。我的默认结构指针是否存储其自身的地址。我指的是结构体,所以如果我打印 ptr ,它会输出结构体 ptr 的地址吗?

最佳答案

这里有很多东西需要解压...这些都没有初始化,然后你给一个指针别名而不是指向一个地址,所以你实际上没有一个指向指针的指针,你有两个相同的指针

struct node *head;
struct node **startPtr;
startPtr = head;
struct node *nodePtr;

也许是这样的:

struct node *head = NULL;
struct node **startPtr = &head;
struct node *nodePtr = NULL;

会是一个更好的开始...那么在C中你不能取消引用NULL指针,所以你必须首先检查是否有可能存在空指针...注意这不会检查未初始化的垃圾值,这局部变量可以是:

if(startPtr && *startPtr)
{
// now you know you can deref startPtr twice,
// once to a pointer to an object (which might be null)
// then after then && you can deref to an actual object
}

关于c - 在函数中使用双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46667777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com