这是我的代码

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/

10-10 03:27