这是我的代码
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结构的地址,我可以通过指针算法访问其余的代码。我的问题来自此处的代码,因为只有3个Account结构,不应该(allUsers + 3)评估为null吗?有没有一种方法可以使(allUsers + 3)计算为null?我的测试结果为0,为假。
最佳答案
allUsers + 3
表示从分配给struct customer_account
的地址开始的第四个allUsers
。在任何情况下都不能为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/