gpt4 book ai didi

c - tcc 中的空指针检测

转载 作者:行者123 更新时间:2023-11-30 14:56:05 27 4
gpt4 key购买 nike

我创建了一个非常简单的链表,并注意到我的代码的 tcc filename.ctcc filename.c -run 的输出存在差异:

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

struct llist {
struct llist *next;
struct llist *last;
struct llist *first;
int value;
int item;
int *length;
};

struct llist *newList(int v){

struct llist *l1 = malloc(sizeof(struct llist));
l1 -> length = malloc(sizeof(int));
*l1 -> length = 1;

l1 -> value = v;
l1 -> item = 0;
l1 -> first = l1;

return l1;
}

struct llist *appendList(struct llist *l1, int v){

struct llist *l2 = malloc(sizeof(struct llist));

l2 -> value = v;
l2 -> last = l1;
l2 -> first = l1 -> first;
l2 -> length = l1 -> length;
*l2 -> length += 1;
l2 -> item = l1 -> item + 1;

l1 -> next = l2;

return l2;
};

int main(){
struct llist *list = newList(4);
list = appendList(list, 6);
list = appendList(list, 8);
list = appendList(list, 10);

list = list -> first;

int end = 0;
while(end==0){

printf("VAL: %d\n", list -> value);

if(list -> next == NULL){
printf("END\n");
end = 1;
}else{

list = list -> next;
}
}


return 0;
}

使用tcc filename.c编译然后运行它会产生我期望的输出:

VAL: 4
VAL: 6
VAL: 8
VAL: 10
END

这也是我在 GCC 和 clang 中得到的输出。

当我使用tcc filename.c -run时,我得到:

VAL: 4
VAL: 6
VAL: 8
VAL: 10
VAL: 27092544
VAL: 1489483720
VAL: 0
END

最后一个数字始终为零,而每次运行时其他两个额外值都不同。

我找到了在 newList 函数中添加 l1 -> next = NULL;l2 -> next = NULL; 的解决方案> 在 appendList 函数中。

但我想知道为什么输出存在差异。编译器中是否存在错误,或者我是否错误地没有将指针初始化为 NULL ,即使它在大多数编译器中都可以工作?

最佳答案

I figured out the solution which was adding l1 -> next = NULL; in the newList function and l2 -> next = NULL; in the appendList function.

But I was wondering why there was a difference in output. Is there a bug in the compiler or was I wrong for not initialising the pointer to NULL even though it works in most compilers?

您错误地访问了指针的值,而没有为其赋值,或者导致它被显式或隐式初始化(​​这与赋值不同)。这样做会产生未定义的行为。尽管如此,该程序在某些情况下碰巧表现出了您所期望的行为,这是一个可能且合理的结果,但它并不能验证该程序。

此外,您可能会发现您原来的方法不能与您在更复杂的情况下测试的其他编译器一起可靠地工作(但我只能对此做出概率性的陈述,因为“未定义”)。

关于c - tcc 中的空指针检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976778/

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