gpt4 book ai didi

c - 变量地址与数组元素地址冲突

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:44 24 4
gpt4 key购买 nike

我遇到了一个对我来说很奇怪的问题,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

最佳答案

您必须在适当的指针变量中捕获 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,您不能在退出定义它的 block 后使用该变量(因此您不必释放它),但您只能将它传递给被调用的函数;您不能返回。

哪个更合适取决于循环结束后你要对数组做什么。

关于c - 变量地址与数组元素地址冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23250446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com