变量的地址和数组元素冲突

时间:2014-04-23 16:40:27

标签: c arrays

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

3 个答案:

答案 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的新手。

  1. 数组索引从0开始。因此ìtemStock[1]是具有1个元素的数组的第二个元素。因为参数和本地都存储在堆栈中,所以你可以通过事件得到参数的地址。

  2. 请阅读有关malloc用法的内容。互联网上有足够的教程。