这是我的代码
struct customer_account {
char login[20];
char password[20];
int balance;
};
typdef struct customer_account Account;
int main(int argc, char *argv[]) {
Account *allUsers;
allUsers = (Account *) calloc(3, sizeof(Account));
*allUsers = (Account) {"Ann", "nna", 100);
*(allUsers + 1) = (Account) {"Beth", "hteb", 200};
*(allUsers + 2) = (Account) {"Carl", "lrac", 500};
printf("%p\n", allUsers + 3);
printf("%d\n", (allUsers + 3) == NULL);
}
当我运行程序时,这是我得到的输出(不理解指针值的意义,没有真正研究过十六进制)。
0x9d6908c
0
根据我的理解,我正在做的是从操作系统请求足够的内存来存储 3 个 Account 结构(我稍后释放它),并且指针 allUsers 可用于存储我从中获得的第一个 Account 结构的地址动态分配,我可以通过指针算术访问其余部分。我的问题来 self 的代码,因为只有 3 个 Account 结构,所以 (allUsers + 3) 不应该被评估为 null 吗?有没有办法让 (allUsers + 3) 计算结果为 null?我的测试结果为 0,错误。
最佳答案
allUsers + 3
表示分配给 allUsers
的地址中的第四个 struct customer_account
。在任何情况下它都不可能是NULL
。与此相同
&allUsers[3]
它的内容可以清零,但指针本身是相对于有效指针的正偏移量,并且标准要求它为非 NULL,因为它比动态分配的数组末尾多了一个字节。
要了解发生了什么,请进行以下实验:
for (int i = 0 ; i != 4 ; i++) {
printf("%p\n", (void*)(allUsers + i));
}
这将打印四个数字 - 第一个是 allUsers
,第二个是 allUsers
加上一个 struct customer_account
的大小,第三个是allUsers
加上两个 struct customer_account
的大小,最后一个就是您的程序打印的内容。正如您所看到的,这些地址是简单计算的结果,与实际数组的内容无关。
关于c - 如何使指针 == null 测试通过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27093662/