Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
1

Caught unexpected signal: SIGSEGV (11). Invalid memory access

09.03.2023, 11:15. Показов 1268. Ответов 3
Метки си (Все метки)

Author24 — интернет-сервис помощи студентам
Задание в следующем: написать функцию, которая из массива строк делает одну строку, разделенную запятыми и при этом между последними двумя словами в строку помещается "and". Пустые массивы игнорируются. Вот пример:
['ninja', 'samurai', 'ronin'] --> "ninja, samurai and ronin"
['ninja', '', 'ronin'] --> "ninja and ronin"
[] -->""

Вот мой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
char *words_to_sentence (char *words[])
{
  int i = 0, j = 0, k = 0, count = 0, ct = 0, memory = 0;
  char *string;
 
  while(words[count] != NULL)
  {
      if(strlen(words[count]) != 0)
          ct++;
 
      count++;
  }
 
  char *temp[ct];
 
  for(i = 0; i < count; i++)
  {
      if(strlen(words[i]) != 0)
      {
          temp[k] = (char *)malloc(strlen(words[i]) + 1);
          strcpy(temp[k],words[i]);
          memory += strlen(temp[k]);
          k++;
      }
  }
 
  memory += 1;
 
  if(k == 2)
      memory = memory + 5;
  else if(k > 2)
      memory = memory + (k-2)*2 + 5;
 
  printf("%d\n",memory);
 
  string = (char *)malloc(memory);
 
  k = 0;
 
 
 
  for(i = 0; i < ct; i++)
  {
 
    for(j = 0; temp[i][j] != '\0'; j++)
    {
        string[k] = temp[i][j];
        k++;
    }
    if(i < ct - 2)
    {
      string[k] = ',';
      k = k + 1;
      string[k] = ' ';
      k = k + 1;
    }
    if(i == ct - 2)
    {
        string[k] = ' ';
        k = k + 1;
        string[k] = 'a';
        k = k + 1;
        string[k] = 'n';
        k = k + 1;
        string[k] = 'd';
        k = k + 1;
        string[k] = ' ';
        k = k + 1;
    }
  }
 
  string[k] = '\0';
 
 
return string;
 
 
 
}
На моём компе всё работает, тесты же выдают ошибку из заголовка темы. Раньше такое бывало, когда либо я выделял лишнюю память, либо её не хватало, даже хоть на байт. Здесь же вроде бы выделил всё тютелька в тютельку и для массива без пустых строк и для итоговой строки. Не понимаю почему тесты крашаться. Подскажите если кому не в лом.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2023, 11:15
Ответы с готовыми решениями:

Проблема - Program received signal SIGSEGV: Segmentation fault - invalid memory reference
После выполнения программы, компилятор выводит Program received signal SIGSEGV: Segmentation fault - invalid memory reference.Что делать???...

Ошибка Program received signal SIGSEGV: Segmentation fault - invalid memory reference
program GR110 REAL:: a(3), Q(-3:2,0:3), b(100) OPEN (1, file = 'М',status = 'old') OPEN (2, file = 'Вектор',status = 'new') do...

NASM: Invalid memory reference (SIGSEGV)
Всем привет. Изучаю ассемблер, пользуюсь NASM. Подскажите нубасу, что не так в коде? Я вот что-то не могу найти &quot;не валидную ссылку...

3
 Аватар для CoderHuligan
1733 / 998 / 257
Регистрация: 30.06.2015
Сообщений: 5,037
Записей в блоге: 55
09.03.2023, 12:00 2
Зачем 3 раза вызывать strlen тут:
C
1
2
3
4
5
6
7
if(strlen(words[i]) != 0)
      {
          temp[k] = (char *)malloc(strlen(words[i]) + 1);
          strcpy(temp[k],words[i]);
          memory += strlen(temp[k]);
          k++;
      }
Об оптимизации ничего не слышно? strlen для вычисления длины пробегает всю строку до нулевого завершающего байта. Это же не Паскаль, а си. Гораздо лучше так:
C
1
2
3
4
5
6
7
8
int l=0;
if((l=strlen(words[i])) != 0)
{
    temp[k] = (char *)malloc(l + 1);
    strcpy(temp[k],words[i]);
    memory += l;
    k++;
}
Далее. Вот не понятно, что хотел этим сказать программист:
C
1
2
else if(k > 2)
      memory = memory + (k-2)*2 + 5;
Хотел выделить память чтобы хватило на запятые и пробелы? Но что-то тут не одно с другим не вяжется. Проверяй еще. Скорее всего именно тут утечка.
1
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
09.03.2023, 17:45 3
Лучший ответ Сообщение было отмечено crazykreis как решение

Решение

Цитата Сообщение от crazykreis Посмотреть сообщение
На моём компе всё работает, тесты же выдают ошибку из заголовка темы.
в тестах есть такая проверка
C
1
 words_to_sentence (NULL)
нужна проверка на NULL где-нибудь в начале функции .
C
1
2
3
4
5
char *words_to_sentence (const char * const words[])
{
   
    if(words == NULL)
       return calloc(1, 1);
1
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
09.03.2023, 17:52  [ТС] 4
NEED-A-JOB, спасибо, помогло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2023, 17:52
Помогаю со студенческими работами здесь

X64 GetThreadContext Error 998: Invalid Access Memory Location
Доброго времени суток. При попытке получить контекст потока if (!GetThreadContext(handle, ref context)) throw new...

Signal 11 (SIGSEGV)
То ли я дурак, то ли лыжи не едут. Во время тестирования, прога проходит 6 тестов, на 7-ом возникает Run-time error с доп.информацией...

Fatal signal 11 (SIGSEGV)
Собственно, приходит вот такая ощибка. Тэг у неё &quot;libc&quot;. Я использую NDK и код на Си. И проблема даже не в самой ощибки, а в том что я не...

Program received signal sigsegv
Здравствуйте, я писал код для метода Квайна и столкнулся с такой проблемой program received signal sigsegv segmentation fault При запуске...

Fatal signal 11 (SIGSEGV) at 0x000000b4
Приветствую всех форумчан! Пишу сетевую игру под андроид используя библиотеку libGDX (релиз 0.9.9). На всех эмуляторах андроид начиная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru