初始化指向char数组的指针时出现分段错误

时间:2019-07-01 13:19:12

标签: c pointers

我正在尝试编写一个程序,该程序从文件中读取文本,将字符转换为大写,然后将输出写入新文件。该代码对于读取和转换为大写字母部分工作正常,但是在我为输出文件的名称创建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_countoffset

编辑: 问题是使用buf_rd的未初始化指针。当我添加

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

它解决了这个问题。

谢谢李斯特先生和潜伏者!

2 个答案:

答案 0 :(得分:3)

char* buf_rd;
...
nr = pread(fd, buf_rd, byte_count, offset);

您没有为buf_rd分配内存。它只是一个指针。

答案 1 :(得分:1)

您使用buf_rd作为缓冲区,但是该变量仅被声明且从未初始化。

documentation说:

  

ssize_t pread(int fd ,void * buf ,size_t < em> count ,off_t offset );

     

pread()从文件描述符 fd 偏移量读取最多 count 个字节   (从文件的开头) offset (偏移)从 buf 开始进入缓冲区。   文件偏移不会更改。

期望您初始化pread函数可以使用的缓冲区。