这是我的代码
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,错误。
答案 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分配了多少内存。您需要自己跟踪,可以在单独的变量中,也可以为具有特殊终止值的元素分配额外的空间。