Исключение, выдаваемое при попытке сравнения с использованием указателей - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь создать цикл, в котором указатель указывает на разные элементы в массиве (сортировка по убыванию), и я не могу правильно выполнить сравнение, поскольку всегда выдается исключение. У меня также есть цикл для печати всех элементов указателя, чтобы проверить правильность работы цикла. Никогда прежде не использовал указатели, но я пытался форматировать их так же, как на других сайтах при изучении указателей. Это та часть кода, о которой я говорю:

//What I have included
#define _CRT_SECURE_NO_WARNINGS
#define MAX 5
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

//Variables related to the loops
int nums[MAX], *ptrd[MAX];

//Loops in question (Assume nums[MAX] = {1, 2, 3, 4, 5})
for (int i = 0; i < MAX; i++)
{
    for (int j = 0; j < MAX; j++)
    {
        if (*ptrd[i] < nums[j] && nums[j] <= *ptrd[i - 1])
        {
            if (i > 0)
            {
                if (ptrd[i] == ptrd[i - 1])
                    continue;
            }
            ptrd[i] = &nums[i];
        }
    }
}
for (int i = 0; i < MAX; i++)
{
    printf("\n%d", *ptrd[i]);
}

Текущий полный код (обратите внимание, что рассматриваемый код отличается):

#define _CRT_SECURE_NO_WARNINGS
#define MAX 5
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>

//Variables
char input[20];
int nums[MAX], *ptrd[MAX], *ptra[MAX];
bool isValid;

//Methods
bool checkValidity();
void convertChars();
void resetInput();

int main()
{
    printf("Please enter 5 numbers (Separate each by spaces): ");
input:
    resetInput();
    scanf(" %[^\n]%*c", &input);
    isValid = checkValidity();

    if (isValid == false)
    {
        printf("Invalid input. Retry: ");
        goto input;
    }
    convertChars();

    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            if (*ptrd[i] < nums[j])
            {
                if (i > 0)
                {
                    if (ptrd[i] == ptrd[i - 1])
                        continue;
                    if (nums[j] <= *ptrd[i - 1])
                        ptrd[i] = &nums[i];
                }
                else
                    ptrd[i] = &nums[i];
            }
        }
    }
    for (int i = 0; i < MAX; i++)
    {
        printf("\n%d", (*ptrd)[i]);
    }

    getchar();

    return 0;
}

bool checkValidity()
{
    bool multNum = false;
    int chars = 0;

    for (int i = 0; i < 20; i++)
    {
        if (!isdigit(input[i]))
        {
            if (input[i] == ' ' && multNum == true || input[i] == NULL && multNum == true)
                chars += 1;

            if (input[i] != ' ' && input[i] != NULL)
            {
                printf("\nIncorrect characters\n");
                return false;
            }
            if (input[i] == ' ' && multNum == false)
            {
                printf("\nToo many spaces at at once\n");
                return false;
            }
            if (input[i] == ' ' && multNum == true || input[i] == NULL && multNum == true)
                multNum = false;
        }
        else if (isdigit(input[i]))
        {
            multNum = true;
        }
    }
    if (chars != 5)
    {
        printf("\nIncorrect amount of nums (%d)\n", chars);
        return false;
    }
    else
        return true;
}

void convertChars()
{
    int placeHolder, nums_ = 0, done = 0;
    for (int i = 0; i < 20 && done < 5; i++)
    {
        if (isdigit(input[i]))
        {
            placeHolder = input[i] - '0';
            nums_ = (nums_ * 10) + placeHolder;
        }
        else
        {
            nums[done] = nums_;
            nums_ = 0;
            done += 1;
        }
    }
}

void resetInput()
{
    for (int i = 0; i < 20; i++)
    {
        input[i] = NULL;
    }
}

1 Ответ

0 голосов
/ 29 апреля 2018

Вы не инициализировали *ptrd[MAX], что приводит к неопределенному поведению. Запустите ваш код с помощью GDB, и он завершится с таким выводом:

(gdb) run
Starting program: /home/pringles/Desktop/a.out 
Please enter 5 numbers (Separate each by spaces): 3 2 1 5 6

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400719 in main () at test.c:37
37              if (*ptrd[i] < nums[j])

Распечатав элементы в ptrd, вы увидите, что все элементы указывают на 0x0:

(gdb) print ptrd
$1 = {0x0, 0x0, 0x0, 0x0, 0x0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...