第一次 scanf 后 C 程序崩溃

C program crash after first scanf

这个函数导致我的程序崩溃:

void input_data(int** data, int* data_size)
{
    int i;
    char c;

    //input with error handling
    do
    {
        printf("Write, how many integers you want to input: ");
    }
    while (((scanf("%d%c", data_size, &c) != 2 || c != '\n') && clear_stdin()));

    //memory reallocation
    *data = (int *) realloc(*data, *data_size * sizeof(**data));

    printf("\nInput %d integers\n", *data_size);

    for (i = 0; i < *data_size; i++)
    {
        while ((scanf("%d%c", data[i], &c) != 2 || c != '\n') && clear_stdin());
    }
}

在我的 main() 中我得到了

int* numbers = (int *) malloc(1 * sizeof(*numbers));
int input_size;
input_data(&numbers, &input_size);

我的程序在第一次输入整数后崩溃,我相信这是由 scanf 引起的,但我不明白为什么。 如果您需要,我可以提供我程序的完整源代码。

这不是您所期望的:

scanf("%d%c", data[i], &c)

data[i] 不是数组中第 i 个元素的地址。此表达式转换为 *(data + i)。该表达式实际上将 data 视为 int * 的数组,但 data 是指向 int * 变量的指针,因此这会导致未定义的行为。

您想先取消引用 data,然后获取数组元素。所以你想要的表达式是 (*data + i),或者等价地 &((*data)[i]).