我创建了一个非常简单的链接列表,并注意到我的代码tcc filename.c
与tcc 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
每次运行时,最后一个数字始终为零,另外两个额外值不同。
我找到了在l1 -> next = NULL;
函数中添加newList
并在l2 -> next = NULL;
函数中添加appendList
的解决方案。
但我想知道为什么输出会有所不同。编译器中是否有错误,或者我没有初始化指向NULL
的错误,即使它在大多数编译器中都有效?
答案 0 :(得分:1)
我找到了正在添加
<div id="navigation"></div> <div class="parallax"><h5 id="header"><b>Welcome to RyanTeaches</b></h5></div> <!--<img src="bg.jpg" style="top:60px;height: 510px;min-width: 100%;">--> <div id="content"> <h2 style="margin-top: 0px;">Activities</h2> </div> <div id="container1" style="padding-bottom: 400px;"> <div class="wrap"> <img class="img-circular1" src="http://via.placeholder.com/150x150"/> </div> <div class="wrap"> <img class="img-circular2" src="http://via.placeholder.com/150x150"/> </div> <div class="wrap"> <img class="img-circular3" src="http://via.placeholder.com/150x150"/> </div> </div> <div id="content"> <h2 style="margin-top: 0px;">Activities</h2> </div>
的解决方案l1 -> next = NULL;
函数中的newList
函数和l2 -> next = NULL;
。但我想知道为什么输出会有所不同。有没有 编译器中的错误或者因为没有初始化指针而错了
appendList
即使它适用于大多数编译器吗?
访问指针的值而没有将其指定为一个或导致它被显式或隐式初始化(这与指定值不同)是错误的。这样做会产生未定义的行为。然而,该程序恰好表现出您在某些情况下所期望的行为,这是一个可能的,可能的结果,但它并没有验证该程序。
此外,您可能会发现原始方法 无法在更复杂的情况下与您测试的其他编译器可靠地工作(但我只能对此进行概率陈述,因为“未定义” “)。
答案 1 :(得分:0)
通常在调试程序时,调试器会初始化所有内容,但在生产中没有初始化,因此下一个值不为null
初始化下一个变量。
答案 2 :(得分:0)
函数calloc()返回一个指向初始化为零的字节序列的指针;相比之下,malloc()返回一个指向一个字节序列的指针,这些字节可能会或可能不会发生在最初包含零。在某些平台上,这些字节在malloc()之后总是包含零;在其他人身上,至少其中一些人永远不会。通常,不可预测哪些字节将保持为零,哪些字节不会。
在大多数平台上,包括几乎所有在过去几十年中创建的平台,清除指针对象的所有字节都会将指针设置为NULL。在记录此类行为的平台上,使用“calloc”而不是“malloc”为包含指针的结构创建空间将是将所有指针初始化为NULL的可靠方法。但是,如果使用“malloc”或“realloc”而不是“calloc”创建存储,则需要使用“memset”将所有字节设置为零,或者将其中包含的指针明确地设置为NULL。