我遇到了一个对我来说很奇怪的问题,unsigned int
和数组元素的地址完全相同。我尝试使用malloc
,但它不能用它。使用realloc
,它无效,因为没有malloc
。使用两者,同样的问题继续。你怎么想,我错过了一些非常简单的东西吗?我是C的新手,我设法理解在Xcode中使用断点的问题。
这是代码块;
int stocksMain(unsigned int itemQuantity)
{
if (itemQuantity == 0) {
getErrorManifest(501);
return -1;
}
else {
unsigned int itemStock[] = {0};
char line[BUFSIZ];
clearInputBuffer();
memset(&line, 0, sizeof(line));
printf("%s\n", "Enter the stocks of items:");
printf("Address of itemQuantity: %p\nAddress of itemStock[1]: %p\n", &itemQuantity, &itemStock[1]);
malloc(itemQuantity);
printf("New address of itemQuantity: %p\nNew address of itemStock[1]: %p\n", &itemQuantity, &itemStock[1]);
for (int i = 0; i < itemQuantity; ++i) {
printf("#%d: ", i + 1);
fgets(line, BUFSIZ, stdin);
if ( (line[0] == 'f') || (line[0] == 'F') ) {
//doStockOfItemIsInfinite
}
else {
sscanf(line, "%u", &itemStock[i]);
}
}
return 0;
}
} //end stocksMain
输出:
Enter the stocks of items:
Address of itemQuantity: 0x7fff5fbff7c0
Address of itemStock[1]: 0x7fff5fbff7c0
New address of itemQuantity: 0x7fff5fbff7c0
New address of itemStock[1]: 0x7fff5fbff7c0
#1: Program ended with exit code: 9
答案 0 :(得分:2)
您必须在适当的指针变量中从malloc()
捕获返回值。
此外,itemStock
中唯一有效的元素是itemStock[0]
。您可以生成地址itemStock[1]
,但无法合法访问该地址的数据。在您的情况下,地址itemStock[1]
与您的简单变量itemQuantity
相同;这完全没问题,但你不能依赖于这种行为。
我怀疑你的代码有点像:
char line[BUFSIZ];
unsigned itemStock[itemQuantity]; // C99 or later VLA
clearInputBuffer();
printf("%s\n", "Enter the stocks of items:");
for (int i = 0; i < itemQuantity; ++i)
{
printf("#%d: ", i + 1);
if (fgets(line, sizeof(line), stdin) == 0)
break;
else if (line[0] == 'f' || line[0] == 'F')
{
//doStockOfItemIsInfinite
}
else if (sscanf(line, "%u", &itemStock[i]) != 1)
...report error...
}
或者也许:
char line[BUFSIZ];
unsigned *itemStock = malloc(itemQuantity * sizeof(*itemStock));
if (itemStock == 0)
...memory allocation failed...do not continue...
clearInputBuffer();
printf("%s\n", "Enter the stocks of items:");
for (int i = 0; i < itemQuantity; ++i)
{
printf("#%d: ", i + 1);
if (fgets(line, sizeof(line), stdin) == 0)
break;
else if (line[0] == 'f' || line[0] == 'F')
{
//doStockOfItemIsInfinite
}
else if (sscanf(line, "%u", &itemStock[i]) != 1)
...report error...
}
区别在于malloc()
,您必须明确使用free(itemStock);
,但您可以将itemStock
返回给调用函数。相比之下,对于本地VLA,您不能在退出定义的块之后使用该变量(因此您不必释放它),但是您只能将它传递给被调用的函数;你无法退货。
哪个更合适取决于循环结束后你将如何处理数组。
答案 1 :(得分:1)
itemStock是一个包含单个元素的数组。因此,&amp; itemStock [1]是一个有效的地址,但可以等于另一个对象的地址。在这种情况下,它是。我不知道你对malloc()的调用是怎么回事。什么都没用,我可以告诉你那么多。
答案 2 :(得分:0)
可能你是C的新手。
数组索引从0开始。因此ìtemStock[1]
是具有1个元素的数组的第二个元素。因为参数和本地都存储在堆栈中,所以你可以通过事件得到参数的地址。
请阅读有关malloc
用法的内容。互联网上有足够的教程。