我遇到过一个奇怪的问题,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,在变量被定义后,您不能使用该变量(因此您不必释放它),但只能传递给被调用的函数;不能返回它。
哪个更合适取决于循环完成后要对数组执行的操作。

10-08 18:58