【发布时间】:2012-03-27 02:58:21
【问题描述】:
我正在学习 C,但现在我碰壁了。我很难理解指针。
想象一下我有这个代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define DELTA 33
int calls, seed=356;
int sum_ds(int a){
int d=DELTA;
calls++;
return a+d+seed;
}
int main() {
int num;
int *ptr;
int **handle;
num = 14;
ptr = (int *)malloc(2 * sizeof(int));
handle = &ptr;
*(*handle+0) = num;
*(*handle+1) = num+1;
*ptr = num-2;
ptr = #
*ptr = sum_ds(num-2);
}
按照我的理解一步一步来。
1 - int calls 创建了一个名为 calls 的变量,并且没有对其进行初始化,因此它包含垃圾。它存储在 DATA 上,假设内存地址为 0xFFAA。
2 - int 种子创建一个名为种子的变量,用整数 356 初始化。它存储在 DATA 上,假设内存地址为 0xFFAB。
3 - int num 创建了一个名为 num 的变量,并且没有对其进行初始化,因此它包含垃圾。它存储在堆栈上,假设内存地址为 0xFFAC。
4 - int *ptr 创建一个指向 int 的指针并且不为其分配任何地址。它存储在堆栈上,假设内存地址为 0xFFAD。
5 - int **handle 创建一个指向 int 指针的指针,并且不为其分配任何地址。它存储在堆栈上,假设内存地址为 0xFFAE。 (这里有很多疑问)
6 - num = 14 转到地址 0xFFAC 并在其上存储数字 14。它在堆栈中完成。
7 - ptr = (int *)malloc(2 * sizeof(int)) 在 HEAP 上,它被分配了 2 个整数的内存大小,并且第一个内存字节的地址(比如说 0xFFZZ)存储在(在堆栈上) ptr 所以现在 *ptr 指向那个内存地址。
8 - 句柄 = &ptr 句柄现在指向 ptr。我相信它现在指向 0xFFZZ 上的任何内容(这里有很多疑问)
9 - *(*handle+0) = num 指向 int 指针的指针现在被赋值为 num (14) (这里有很多很多很多疑问)
10 - *(*handle+1) = num+1 指针的指针加上 int 之一,现在它被赋值为 num + 1 (15) (这里有很多很多很多疑问)
11 - *ptr = num-2 ptr 的值点,它被分配了 num - 2 (12) 的值。我相信它会到达内存地址 0xFFZZ 并在那里存储数字 12。
12 - ptr = &num ptr 现在指向 num,我相信它现在指向 0xFFAC。
13 - *ptr = sum_ds(num-2) ptr指向的值就是sum_ds的返回值。我相信 0xFFAC 它被分配了 401 (12+33+356)
是这样吗?
【问题讨论】:
-
int 的大小不是 1 字节......它是 4 字节(或 8 字节)。所以在第2步中,地址不能是0xFFAB(因为那个地址是第1步中int的第二个字节)
-
@Aziz:
int通常会大于一个字节,但这不是严格要求的(但如果它只有一个字节,你必须有一个字节至少 16 位)。 -
+1 反对不合理的反对票。
-
@PéterTörök 感谢您的支持。不明白为什么有人给了我一个downvote :(