У меня возникли серьезные проблемы с 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");
Я вижу пару проблем.
Не использовать while (!foeof(a))
, Увидеть Почему «while (! Feof (file))» всегда неверно?.
Вы не выделяете достаточно памяти для слов. Как следствие, вы в конечном итоге используете память, которую вы не должны. Это приводит к неопределенному поведению.
Использование:
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);
}
Других решений пока нет …