Я пытаюсь скомпилировать и запустить программу под C на моем Ubuntu & amp; Машины Windows с GCC и amp; VC9. Тем не менее, я столкнулся с нижеперечисленными проблемами:
GCC компилируется отлично, но при запуске мне показывают это приглашение:
Segmentation Fault (Core Dump).
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;
}
Переполнение буфера Hello!
char *s="";
sprintf(s,"%d",curr);
length=strlen(s);
Вы выделяете один байт для строки в стеке, а затем переходите к написанию более одного байта. И в довершение всего, вы читаете за пределами этого массива. Пожалуйста, прочитайте руководство по C и особенно раздел о строках и выделите для них память.