【问题标题】:Segmentation fault when initializing pointer to char array初始化指向 char 数组的指针时出现分段错误
【发布时间】:2019-07-01 21:47:17
【问题描述】:

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

它解决了问题。

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

【问题讨论】:

  • 在哪里初始化 buf_rd?
  • @MrLister 它在 pread() 中被初始化。我也尝试使用 NULL 和其他临时值对其进行初始化,但问题仍然存在。
  • @OmerFY 不,它没有。 pread 期望您传递一个有效的缓冲区指针。 buf_rd 没有有效的缓冲区指针。这是一个未初始化的指针。用 NULL 初始化它会导致pread 尝试写入地址 NULL,这很糟糕。不清楚在您的上下文中“其他临时值”是什么意思。你说你已经尝试过使用malloc,但没有具体说明你是做什么/如何做到的。
  • @lurker 我尝试将 malloc 用于 file_name_write 但现在我已尝试使用 buf_rd 并解决了问题。谢谢!
  • 在调用pread之前你需要buf_rd = malloc(byte_count * sizeof *buf_rd);之类的东西

标签: c pointers


【解决方案1】:
char* buf_rd;
...
nr = pread(fd, buf_rd, byte_count, offset);

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

【讨论】:

  • 我注意到了,我已经更新了答案。不过谢谢 ;) 我在重新阅读 strtok() 的文档之前写了答案。
【解决方案2】:

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

documentation 说:

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

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

您需要初始化一个可供pread 函数使用的缓冲区。

【讨论】:

    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2019-08-19
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多