【发布时间】: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_count和offset值
编辑:
问题是带有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);之类的东西