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

时间:2014-11-23 20:03:43

标签: 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个帐户结构(我稍后释放),并且指针allUsers可用于存储我从中获取的第一个Account结构的地址动态分配,我可以通过指针算法访问其余的。我的问题来自我的代码,不应该(allUsers + 3)被评估为null,因为只有3个帐户结构?有没有办法使它(allUsers + 3)评估为null?我的测试评估为0,错误。

2 个答案:

答案 0 :(得分:1)

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,最后一个是程序打印的内容。如您所见,这些地址是简单计算的结果,与实际数组的内容无关。

答案 1 :(得分:0)

allUsers是一个指向内存中地址的指针。 如果n> 0,则allUsers + n是指向更高地址的指针。

allUsers和所有其他地址都不知道你用malloc分配了多少内存。您需要自己跟踪,可以在单独的变量中,也可以为具有特殊终止值的元素分配额外的空间。