Что заставляет программу не следовать условиям цикла? - PullRequest
0 голосов
/ 25 октября 2019

Просто базовая программа, написанная новичком. Предполагается прочитать значения в динамический массив, а затем распечатать их в обратном порядке. Вы не можете вводить размер массива заранее, размер массива будет корректироваться до тех пор, пока входные данные не будут заканчиваться символами.

Я думаю, что я написал все в порядке, но есть ошибки в разыменовании указателей и когда я запускаюэто в VS, он даже не будет регистрировать входы. При попытке в другом компиляторе он регистрирует входные данные, но не заканчивается на «-1».

Думая об этом, просматривая его, я не замечаю своей ошибки, надеюсь, вы поможете мне.

Редактировать: спасибо за указание точки с запятой через некоторое время, но теперь это «ошибка повреждения кучи» после ввода 2 или 3 входов. Что пошло не так?

int i=0;
    int *p, *a;
    int n=1;
    p = (int*)malloc(n * sizeof(int));
    printf("Enter integers here, and input -1 when done:\n");
    while (p[i] != -1);
    {
        scanf_s("%d", &p[i]);
        n = i + 1;
        a= (int*)malloc(n * sizeof(int));
        for (int j = 0; j < n; ++j)
        {
            a[j] = p[j];
        }
        free(p);
        p = NULL;
        p= (int*)malloc(n * sizeof(int));
        for (int k = 0; k < n; ++k)
        {
            p[k] = a[k];
        }
        free(a);
        a = NULL;
        ++i;
    }
    --i;
    if (i <= 0)
    {
        printf("%d", p[i]);
        --i;
    }
    free(p);
    p = NULL;

Ответы [ 2 ]

4 голосов
/ 25 октября 2019
while (p[i] != -1);

удалить завершающий ;.

Также malloc дает вам неинициализированную память, так что есть вероятность, что условие не выполняется на первой итерации. Вы, вероятно, хотите петлю do { ... } while(...);.

3 голосов
/ 25 октября 2019

Переформатирование вашего кода выявляет (или, по крайней мере, a) ошибку:

int i = 0;
int *p, *a;
int n = 1;
p = (int *)malloc(n * sizeof(int));
printf("Enter integers here, and input -1 when done:\n");
while (p[i] != -1)
  ;
{
  scanf_s("%d", &p[i]);
// ...

После первого while есть запятая точка с запятой, что делает его бесконечным циклом из ничего.

...