c - 如何使指针 == null 测试通过?

标签 c pointers struct

这是我的代码

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/

相关文章:

c++ - 为什么可以将整数类型转换为指针?

c - 指针算术和 Char 数组

c - 程序中途终止

go - 如何为指向不同结构的指针实现相同的功能?

c - Linux C套接字

malloc() 和 free() 的 C 动态内存问题

c++ - 从 GetAdaptersAddresses() 获取子网掩码

c - int 矩阵中的段错误

C struct,其字段名称可以在上下文中引用

c - 算法效率的好引用