【发布时间】:2012-11-03 23:19:00
【问题描述】:
我有一些包含以下部分的代码:
typedef unsigned long long int ulli_t;
typedef unsigned int obj_t;
// --- SOME UNIMPORTANT PART OF CODE
objects = (obj_t*)malloc(hw*sizeof(obj_t));
objNums = (ulli_t*)calloc(hw, sizeof(ulli_t));
printf("%#x, %#x\n", objects, objNums);
// --- SOME UNIMPORTANT CODE
/// NEXT PART IS for-CYCLED
objNums[k] ++;
if (k>=Nobj) {
objects[k] = obj;
Nobj++;
printf(" %lu - %#x - %#x\n", k, objects+k, objNums+k);
};
我已经得到了这部分代码的输出:
0xaafdf9d8, 0xaad693b0
0 - 0 - 0xaafdf9d8
1 - 0 - 0xaafdf9dc
2 - 0 - 0xaafdf9e0
3 - 0 - 0xaafdf9e4
4 - 0 - 0xaafdf9e8
5 - 0 - 0xaafdf9ec
6 - 0 - 0xaafdf9f0
7 - 0 - 0xaafdf9f4
8 - 0 - 0xaafdf9f8
9 - 0 - 0xaafdf9fc
10 - 0 - 0xaafdfa00
11 - 0 - 0xaafdfa04
那么,问题来了——如果“objects”变量不为零,那么为什么“objects+k”为零? 当我制作时:
printf(" %lu - %#x - %#x\n", k, objects[k], objNums[k]);
我得到这样的行:
value of k - 0 - hex value of objNums[k]
这是为什么呢? 一想到那件事,我就已经脑残了。
【问题讨论】:
-
你知道
objects[k] = obj;- 你确定obj在那个时候不为零吗? -
是的。我确定 obj 当时不是零。我想到了那个。我刚才打印出来了。它根本不是零。但还有一些其他的事情。你看,当 k=0 时,objNums+k 等于先前打印的 'objects' 指针值,而不是 'objNums' 值。这让我很困惑。
-
可能缺少一些重要的代码部分。
-
objects[k] 应该被分配给任何 obj 。没有看到更多的代码很难说。
-
objects被声明为obj_t* objects;obj被声明为obj_t obj;
标签: c memory heap-memory calloc