gpt4 book ai didi

c - 为什么 static 关键字在这里防止段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:34 25 4
gpt4 key购买 nike

我在 C 语言中玩弄指针,遇到了一个我不理解的行为。它涉及在以下程序中使用 static 关键字:

/**
* Simple LIFO stack implemented using linked lists
*/
#include <stdio.h>
#include <stdlib.h>

typedef struct LinkedList LinkedList;
struct LinkedList{
int value;
LinkedList *next;
};

int pop(LinkedList **list){
LinkedList *next;
int ret;
ret = (*list)->value;
next = (*list)->next;
//free(*list);
*list = next;
return ret;
}
void push(LinkedList **list, int value){
LinkedList *new = (LinkedList*)malloc(sizeof(LinkedList));
new->value = value;
new->next = (*list);
*list = new;
}

int main() {
LinkedList *myList;

for(int i = 0; i<10; i++)
push(&myList, i);


while(myList!=NULL)
printf("popped %i\n", pop(&myList));

return 0;
}

当我编译并运行上面的代码时,出现了段错误。但是,当我将 myList 的声明更改为 static LinkedList *myList 时,该程序(看似)完美运行:

output without static keyword:
popped 9
popped 8
popped 7
popped 6
popped 5
popped 4
popped 3
popped 2
popped 1
popped 0
popped 1
popped 1970220846
Segmentation fault (core dumped)

output with static keyword:
popped 9
popped 8
popped 7
popped 6
popped 5
popped 4
popped 3
popped 2
popped 1
popped 0

我真的不明白为什么会这样。我相信它与范围有关,因为以下代码在不需要 static 关键字的情况下也能正常工作:

/**
* Simple LIFO stack implemented using linked lists
*/
#include <stdio.h>
#include <stdlib.h>

typedef struct LinkedList LinkedList;
struct LinkedList{
int value;
LinkedList *next;
};

int pop(LinkedList **list){
LinkedList *next;
int ret;
ret = (*list)->value;
next = (*list)->next;
//free(*list);
*list = next;
return ret;
}
void push(LinkedList **list, int value){
LinkedList *new = (LinkedList*)malloc(sizeof(LinkedList));
new->value = value;
new->next = (*list);
*list = new;
}

int main() {
LinkedList *myList;

push(&myList, 0);
push(&myList, 1);
push(&myList, 2);
push(&myList, 3);
push(&myList, 4);
push(&myList, 5);
push(&myList, 6);
push(&myList, 7);
push(&myList, 8);
push(&myList, 9);


while(myList!=NULL)
printf("popped %i\n", pop(&myList));

return 0;
}

我知道段错误的原因是 pop() 函数试图取消引用一个错误的地址(因为显然 myList!=NULL 检查不起作用),但是对于static 关键字神奇地修复了一切!

唯一想到的是,它与将 for 循环中的 myList 指针的引用传递给 push() 有关。虽然我不知道那有什么问题......

谢谢!

最佳答案

未初始化(和零初始化)的静态变量被放入 BSS。 BSS 由加载程序清零。因此,通过使您的变量成为静态变量,您可以有效地将其初始化为 NULL。如果没有 static ,则在堆栈上分配相同的变量。未初始化的堆栈变量可以包含任何随机值(取决于之前使用堆栈的内容)并且访问此类变量会导致未定义的行为。

关于c - 为什么 static 关键字在这里防止段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32240472/

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