2015-10-26 5 views
-2

Я получаю ошибку сегментации при попытке объединить строки. Целью кода является создание 1000 файлов каждый с возрастающими именами hw7-1.data, hw7-2.data и т. Д., Пока вы не дойдете до hw7-999.data. Это должно быть более тривиально, чем я это делаю, и единственная причина, по которой это происходит, заключается в том, что строка назначения выходит за границы, но я просто не вижу ее. У меня есть пара дополнительных включений, которые я знаю, но кроме того, я не понимаю, почему это происходит на первой strcat. Любые мысли как тОшибка сегментации с помощью strcat()

Выход:

Здесь

Seg Fault

#include<stdio.h> 
#include<string.h> 
#include<pthread.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<fcntl.h> 
#include<sys/stat.h> 

int main(void) 
{ 
    int x; 
    char* number; 
    number=malloc(10); 
    char* filename; 
    filename=malloc(100); 
    char* end; 
    end=malloc(10); 
    for (x=0; x<1000; x++) 
    { 
     filename="./hw7-"; 

     sprintf(number, "%d", x); 
     printf("%s\n", number); 
     printf("Here \n"); 
     strcat(filename,"1"); 
     printf("Here \n"); 
     strcat(filename,".data"); 
     printf("Here \n"); 
     int fd2 = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH); 

    } 
} 
+3

'имя_файла =«./ hw7 -»;' не делать то, что вы думаете, что он делает. –

+0

'filename =" ./ hw7 - ";' -> 'strcpy (filename,. ./hw7 -"); ' – BLUEPIXY

+1

Лучше использовать' free' после 'malloc'. – Downvoter

ответ

2

Проблема вызвана линии:

filename="./hw7-"; 
  1. Вы потеряли первоначальную память, выделенную malloc.
  2. filename теперь указывает на раздел памяти только для чтения программы.

Изменение этой строки:

strcpy(filename, "./hw7-"); 

PS

Это не ясно из вашего поста, что ваши намерения с number и end.

Вы назначаете память для end, но я не вижу end.
Вы заполняете number с вызовом sprintf, но после этого вы не используете его.

Вы назначаете память malloc, но не имеете никаких вызовов для освобождения памяти. Вам необходимо добавить:

free(end); 
free(filename); 
free(number); 

до конца main.

+1

Не только это - числовая строка никогда не используется после ее создания ... –

2

Вы выделили память

filename=malloc(100); 

а теперь указывает указатель имен файлов в выделенной памяти.

Но тогда вы переназначить этот указатель

filename="./hw7-"; 

Теперь он указывает на строку буквального в статической памяти. Вы потеряли адрес ранее выделенной памяти. В результате происходит утечка памяти.

Строковые литералы неизменны в C и C++. Поэтому вы не можете использовать strcat со строковыми литералами, и, кроме того, strcat пытается писать за строковым литералом.

strcat(filename,"1"); 

Вы должны написать

strcpy(filename, "./hw7-"); 

вместо assignung указателя.

Другой подход заключается в использовании функции sprintf в одной строке вместо нескольких вызовов строковых функций.

Я не думаю, что вам нужно динамически выделять память для такой короткой строки. Вы можете использовать массив символов или массив символов переменной длины (VLA).

+1

@Jongware Да, он мог бы использовать sprintf. –

1

Ваш код намного сложнее, чем нужно. Другие ответы указывают на ваши ошибки, но вот альтернативный способ написать тот же эффект. Я предполагаю, что вы имели в виду использовать number вместо 1 каждый раз:

for (int x = 0; x < 1000; ++x) 
{ 
    char filename[100]; 
    sprintf(filename, "./hw7-%d.data", x); 
    int fd2 = open(filename, .......... 

}