-3

我写了一个链表库,用于教育自己编写 C 语言并做一些与我的信息技术学习相关的事情。我发现,由于 sizeof(double) 在 4.9 中被解析为 0,所以出现了严重错误:

double ary[] = { 1.0, 2.0, 3.5, 4.9, 5.5 };
LinkedList *list = linkedlist(&ary[0], sizeof(ary[0]));
for( i = 1; i<len(ary); i++ )
    ll_push(list, &ary[i], sizeof(double) );

(此库的此测试中的第 267-270 行)

对于 1.0、2.0 和 3.5,一切都很好,但对于 4.9,它失败了。以前,我在代码中有 sizeof(ary[i]),但现在 sizeof(double) 以相同的方式产生结果。

我真的很生气。谁能解释一下,为什么会这样?

4

2 回答 2

7

除了一些不相关的情况外,sizeof是一个编译时实体,它总是被“解析”并在编译时替换为实际的常量值。这立即意味着您所描述的完全不可能。sizeof(ary[i])不能根据 改变其值i。两者sizeof(double)sizeof(ary[i])在您的平台上总是被立即替换,8并且不依赖于任何运行时因素。

程序中的任何错误都与sizeof. sizeof您关于以某种方式评估0for的结论ary[3]是不正确的。sizeof(double)版本以完全相同的方式失败的事实应该对您有一个明确的提示。

于 2012-10-18T18:33:28.120 回答
1

当您修复所有编译器警告时,您的程序很有可能按预期工作:

cc -Wall -c ll_test.c

ll_test.c:67: warning: initialization makes integer from pointer without a cast
ll_test.c:67: warning: initialization makes integer from pointer without a cast
ll_test.c: In function 'test_dump':
ll_test.c:280: warning: format '%f' expects type 'double', but argument 2 has type 'double *'
ll_test.c:280: warning: format '%f' expects type 'double', but argument 3 has type 'double *'
ll_test.c: In function 'test_get_by_cond':
ll_test.c:295: warning: unused variable 'cmpList'
ll_test.c: In function 'test_datasize_of_last':
ll_test.c:422: warning: unused variable 'result'
ll_test.c: In function 'test_datasize_of_list':
ll_test.c:455: warning: unused variable 'result'

请特别注意 printf 格式错误。

于 2012-10-18T21:36:28.993 回答