我遇到过一个奇怪的问题,unsigned int
和array元素的地址完全相同。我试着用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
最佳答案
必须在适当的指针变量中捕获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,在变量被定义后,您不能使用该变量(因此您不必释放它),但只能传递给被调用的函数;不能返回它。哪个更合适取决于循环完成后要对数组执行的操作。