Ошибка сегментации в функции чтения

У меня возникли серьезные проблемы с Stack Smash Protection, и теперь я получаю новую ошибку — Ошибка сегментации -. Я думаю, что это тесно связано с тем, что у linux есть особая защита. Может кто-нибудь объяснить мне, почему я получаю ошибку сегментации в этом конкретном случае?

vector<const char*> Words;
void read(){
FILE* a;
char s[100];
a = fopen("text.txt", "r");
while (!feof(a))
{
fgets(s, 100, a);
char *newAlloc = new char[strlen(s)];
strcpy(newAlloc, s);
Words.push_back(newAlloc);
}
fclose(a);
}

Обновление: я попробовал все решения и изменил код, но проблема все еще существует, поэтому я попытался уменьшить код до этого:

#include<iostream>
#include<stdio.h>

int main()
{

FILE* a;
a=fopen("text.txt", "r");
fclose(a);

}

Это все еще дает мне эту ошибку в строке с fopen (что является обязательным в упражнении, которое я решаю) — я использую Ubuntu 15.10 и QT Creator вместе с компилятором GCC.

обновление: решено. Я думаю, проблема была в том, что я не дал полный путь к fopen. Я новичок в Ubuntu. Видимо есть некоторые вещи разные.

 char * a = "/home/codrinz/text.txt";
FILE * file = fopen(a, "r");

0

Решение

Я вижу пару проблем.

  1. Не использовать while (!foeof(a)), Увидеть Почему «while (! Feof (file))» всегда неверно?.

  2. Вы не выделяете достаточно памяти для слов. Как следствие, вы в конечном итоге используете память, которую вы не должны. Это приводит к неопределенному поведению.

Использование:

while (fgets(s, 100, a))
{
char *newAlloc = new char[strlen(s) + 1];  // Add +1 for the terminating null character.
strcpy(newAlloc, s);
Words.push_back(newAlloc);
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]