2016-11-25 2 views
0

Я новичок в C, поэтому я попытался сделать программу z-funtion, но в результате компиляции после ввода любой входной информации у меня есть «Обработанный результат 139 (0x8B)) вина Сегментация»C - Возвращенный процесс 139 (0x8B) Ошибка сегментации

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

char s[10001]; 
int main(void) 
{ 
fgets(s, 10001,stdin); 
int mas[strlen(s)]; 
int i, k = 0, help = 0, len = strlen(s); 
for (i = 1; i < len; i++) 
{ 
    if (i <= help) 
    { 
     printf(" i = %d,help = %d ", i,help); 
     mas[i] = fmin(mas[i - k], help - i + 1); 
    } 
    while (i + mas[i] < len) 
    { 
     if (s[i + mas[i]] == s[mas[i]]) 
     { 
      mas[i]++; 
     } 
     else 
     { 
      break; 
     } 
    } 

    if (mas[i] > 0 && i + mas[i] - 1 > help) 
    { 
     k = i; 
     help = i + mas[i] - 1; 
    } 
    printf("%d",mas[i]); 
} 
return 0; 
} 
+1

Что вы вводите? –

+1

'mas' не инициализируется. – BLUEPIXY

+0

aaaaa или ababa - мой стандартный ввод –

ответ

0

проблема заключается в том, что вы не инициализируется mas как массив. Объявления, такие как int array[4], вычисляются во время компиляции, а не во время выполнения, то есть значение в скобках должно быть предопределенной константой, а не переменной. У вас есть два варианта: 1) Предоставлять статический массив, который является достаточно большим (вы сделали это со строкой s) 2) Используйте таНос(), чтобы выделить динамический массив:

int* mas = (int*)malloc(strlen(s) * sizeof(int); 

Помните, чтобы освободить память выделенный таНос, когда он выходит из области видимости:

free(mas); 
+0

, на самом деле, с современными компиляторами C, допускаются массивы переменной длины (VLAs) – user3629249

+0

О, я писал так много c99, разрабатывающих низкоуровневые материалы, которые это даже не передумало: D – Razbit

+0

'mas' неинициализирован. Вам нужно инициализировать его после 'malloc' и point' mas = NULL' после 'free (mas)', чтобы избежать свисающего указателя –

0

Просто Initialise mas с помощью memset

memset(mas,0,sizeof(mas));