Невозможно скомпилировать с GCC на Ubuntu 12.04

Я пытаюсь скомпилировать и запустить программу под C на моем Ubuntu & amp; Машины Windows с GCC и amp; VC9. Тем не менее, я столкнулся с нижеперечисленными проблемами:

На машине Ubuntu:

GCC компилируется отлично, но при запуске мне показывают это приглашение:

Segmentation Fault (Core Dump).

На компьютере с Windows:

VC9 Compiles & amp; работает нормально. GCC компилируется отлично, но процесс завершается, когда программа запускается.

Вам нужна ваша экспертная помощь. Вот мой код:

#include <string.h>
#include <stdio.h>

int calc_slope(int input1,int input2)
{
    int sum=0;
    int start=input1;
    int end=input2;
    int curr=start;

    //some validation:
    if (input1>input2)
        return -1;


    while(curr<=end)
    {
        if (curr>100)
        {
            char *s="";
            int length;
            int left;
            int right;
            int cent;

            sprintf(s,"%d",curr);
            length=strlen(s);
            s++;
            do
            {
                //printf("curr=%d char=%c pointer=%d length=%d \n",curr,*s,s,length);
                left = *(s-1) - '0';
                cent = *s - '0';
                right = *(s+1) - '0';
                //printf("curr=%d l=%d c=%d r=%d\n",curr,left,cent,right);
                if ( (cent>left && cent>right) || (cent<left && cent<right) )
                {
                    sum+=1; //we have either a maxima or a minima.
                }

                s++;
            } while (*(s+1)!='\0');
        }
        curr++;
    }

    return sum;
}

int main()
{
    printf("%d",calc_slope(1,150));
    return 0;
}

Обновление:

Кредит идет к Eliah за то, что он не только помогает мне отслеживать эту ошибку, но также представляет меня gdb и его обратную трассировку tool (bt), которые так полезны при отладке gcc-скомпилированной программы. Вот модифицированная версия, после обработки которой я работал:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int calc_slope(int input1,int input2)
{
    int sum=0;
    int start=input1;
    int end=input2;
    int curr=start;

    //some validation:
    if (input1>input2)
        return -1;


    while(curr<=end)
    {
        if (curr>100)
        {
            int size=10;
            char *s=(char*)malloc((size+1) * sizeof(char));
            int left;
            int right;
            int cent;

            sprintf(s,"%d",curr);
            s++;
            do
            {
                left = *(s-1) - '0';
                cent = *s - '0';
                right = *(s+1) - '0';
                if ( (cent>left && cent>right) || (cent<left && cent<right) )
                {
                    sum+=1; //we have either a maxima or a minima.
                }

                s++;
            } while (*(s+1)!='\0');
        }
        curr++;
    }

    return sum;
}

int main()
{
    printf("%d",calc_slope(1,150));
    return 0;
}
1
задан 13 April 2017 в 15:24

1 ответ

Переполнение буфера Hello!

char *s="";
sprintf(s,"%d",curr);
length=strlen(s);

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

9
ответ дан 25 May 2018 в 00:04
  • 1
    Да, я узнал об этом позже. Но когда я это написал, компилятор VC9 не только разрешил, но и показал результаты правильно. Я напечатал строку (ы), и он показал мне 4, а не 1 !! – Prahlad Yeri 29 March 2013 в 00:43
  • 2
    Не могли бы вы также посоветовать мне, как мне исправить это? Поскольку вы, должно быть, предположили код, у меня нет возможности заранее назначить фиксированный размер * s. Его длина - это количество цифр в переменной curr, которое не может быть известно, пока я не преобразую ее в строку !! ? – Prahlad Yeri 29 March 2013 в 00:45
  • 3
    Я могу, но вы действительно должны отправиться в Stack Overflow для консультирования по программированию, так как здесь довольно оффтоп. – Dennis Kaarsemaker 29 March 2013 в 01:00
  • 4
    @DennisKaarsemaker. Исходный вопрос здесь не может быть не по теме, поскольку он, по-видимому, предполагает поведение, которое отличается от Ubuntu и другой платформы (и я объяснил наиболее вероятную причину этого в моем ответе ). Я согласен с тем, что вопросы о , как правильно распределять строки в C , относятся к переполнению стека, а не здесь. – Eliah Kagan 29 March 2013 в 01:01

Другие вопросы по тегам:

Похожие вопросы: