为什么codeblocks内存转储窗口不显示错误?

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


struct train
{
    int id;
    int hours;
    int minutes;
    char destination[21];
};

// сравнивать поезда по каждому из параметров по возрастанию
// ввод: 2 указателя на 2 поезда
// возврат: больше 0, если поезд дальше в списке, меньше 0, если наоборот
int cmpTrains(void const *, void const *);

int cmpTrains(void const *voidTr1, void const *voidTr2)
{
    int res;
    struct train *tr1 = voidTr1;
    struct train *tr2 = voidTr2;
    if ((tr1->hours * 60 + tr1->minutes) -
        (tr2->hours * 60 + tr2->minutes) != 0)
            res = (tr1->hours * 60 + tr1->minutes) -
            (tr2->hours * 60 + tr2->minutes);
    else if (strcmp(tr1->destination, tr2->destination))
        res = strcmp(tr1->destination, tr2->destination);
    else res = tr1->id - tr2->id;
    return res;
}

// Перевести строчку в вехний регистр
// Ввод: указатель на строчку
// Вывод: изменение строчки по указателю
void to_upper(char *);

void to_upper(char *str)
{
    while (*str)
    {
        *str = toupper(*str);
        str++;
    }
    return;
}


int main()
{
// N is amount of trains
    int K, N;
    struct train **ptrs = NULL;
    scanf("%d%d", &K, &N);
// ptrs it is a pointer, that's reffering to other pointers to train objects.
    ptrs = calloc(N, sizeof(struct train*));
    for (int i = 0; i < N; i++)
    {
        ptrs[i] = (struct train *)malloc(sizeof(struct train));
        scanf("%d %d:%d %s",
              &ptrs[i]->id,
              &ptrs[i]->hours,
              &ptrs[i]->minutes,
              ptrs[i]->destination);
        to_upper(ptrs[i]->destination);
    }
    qsort((void *)ptrs, N, sizeof(struct train *), cmpTrains);
    int cmp = 0, time;
    printf("\n");
    for (int i = 0; i < K; i++)
    {
        time = ptrs[i]->hours * 60 + ptrs[i]->minutes;
        printf("%03d %02d:%02d %s %d\n", ptrs[i]->id, ptrs[i]->hours,
               ptrs[i]->minutes, ptrs[i]->destination, time - cmp);
        cmp = time;
    }
    for (int i = 0; i < N; i++)
        free(ptrs[i]);
    free(ptrs);
    return 0;
}

控制台中的输入为:

4
6
124 12:02 habarovsk
13 12:02 VladiDMir
1 00:01 rOstov
101 23:05 MariuPl
911 17:15 Tagna
921 17:12 Esentuki

我有结构火车。我使用双指针将其中一些“火车”放入堆中。我决定使用内存转储窗口来调试我的项目。我想在堆中找到我的结构,但我发现这个代码块函数有一些模糊的行为。当我在搜索栏表达式“ptrs.destination”中输入时,它以某种方式获取对象“*ptrs[0]”的字段,或者因为它是表达式“ptrs[0]->destination”。我认为 ptr 没有任何字段,它只是一个指针。

我认为这是更正确的查询

为什么没有错误?

我还尝试了其他一些表达式“ptrs->destination”、“(&ptrs)->destination”,这些表达式似乎无效,但结果都相同。

c codeblocks
1个回答
0
投票

您是正确的,

ptrs.destination
不是有效的 C 表达式。

但是谁说地址框接受 C 表达式?

© www.soinside.com 2019 - 2024. All rights reserved.