Ошибка сегментации при инициализации указателя на массив символов - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь написать программу, которая читает текст из файла, преобразует символы в верхний регистр, а затем записывает вывод в новый файл. Код прекрасно работает для чтения и преобразования в верхний регистр, но для записи выходной части, когда я создаю char* для имени выходного файла, я получаю ошибку сегментации.

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

void lowerToUpper(char* temp)
{
    char* name;
    name = strtok(temp,":");

    // Convert to upper case
    char* s = name;
    while (*s)
    {
        *s = toupper((unsigned char) *s);
        s++;
    }
}


int main()
{
    int fd;
    char* file_name_read = "./test.txt";
    fd = open(file_name_read, O_RDONLY);
    char* buf_rd;

    ssize_t nr;
    size_t byte_count = 1000;
    off_t offset = 0;

    nr = pread(fd, buf_rd, byte_count, offset);

    close(fd);

    lowerToUpper(buf_rd);

    char* file_name_write = "./test_uppercase.txt";

    /* CODE FOR WRITING TO THE FILE */

    return 0;
}

Когда я удаляю строку char* file_name_write, код работает нормально. Когда я включаю его в код, я получаю ошибку сегментации.

Я пытался

  • удаление вызова на lowerToUpper() внутри main
  • с использованием char file_name_write[] вместо char* file_name_write
  • с использованием malloc() для выделения пространства и затем присвоения его значения
  • с использованием различных значений byte_count и offset

Edit: Проблема была в неинициализированном указателе с buf_rd. Когда я добавил

char* buf_rd = (char*) malloc(1000 * sizeof(char));

это решило проблему.

Спасибо, мистер Листер и Люркер!

Ответы [ 2 ]

3 голосов
/ 01 июля 2019
char* buf_rd;
...
nr = pread(fd, buf_rd, byte_count, offset);

Вы не выделили память для buf_rd. Это просто указатель.

1 голос
/ 01 июля 2019

Вы используете buf_rd в качестве буфера, но эта переменная только объявляется и никогда не инициализируется.

Документация гласит:

ssize_tpread (int fd , void * buf , size_t count , off_t смещение );

pread () считывает до количество байтов из файлового дескриптора fd со смещением смещение (от начала файла) в буфер, начиная с buf .Смещение файла не изменяется.

Ожидается, что вы инициализируете буфер, который может использоваться функцией pread.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...