我是C的新手,我正在尝试使用read函数。我想取缓冲区中的内容(tempChar)并将其放在另一个char数组(str)中。这样我就可以再次运行read函数并稍后添加到str(因为tempChar将被第二个读取函数重写)。像这样:
char tempChar;
read(0, &tempChar, 10);
char *str;
str= (char*) malloc(10);
memcpy(str, &tempChar, fileSize); /*I'm doing something wrong here*/
这一切让我可以重新运行:
read(0,&tempChar, 1);
str= realloc(str, 11);
str[10]=tempChar;
它编译得很好,但是当我真正尝试运行它时,它会给我一个分段错误。
有什么想法吗?非常感谢。
答案 0 :(得分:1)
char tempChar;
read(0, &tempChar, 10);
您正在从文件中读取10个字符,只能读取单个字符大小的内存
char tempChar
仅为单个字符保留内存,& tempChar指向此单个字节的内存。
char *str;
str= (char*) malloc(10);
// why not now do ?
read(0, str, 10);
答案 1 :(得分:1)
您需要有足够的存储空间来存储您正在阅读的10个字符
你宣布了
char tempChar
可以容纳1个字符。
而是将tempChar声明为
char tempChar[10];
答案 2 :(得分:1)
char tempChar;
仅分配1个字节。所以你只能拿到1个字符。当您memcpy()
请求复制10个不存在的字节时。因此,您读取内存不应导致未定义的行为(它为您提供SegFault)。
您应该执行类似于使用malloc()
执行str的操作或声明像char chatTemp[10]
这样的本地数组。注意:malloc()
不需要在C中进行强制转换。
答案 3 :(得分:0)
您需要提供一个文件描述符作为读取函数的第一个参数。此外,您需要分配char * buffer
而不是char tempChar;
Check sample usage
答案 4 :(得分:0)
如果要读取两次并将结果放在同一个缓冲区中,则不需要临时缓冲区:可以使用指针算法告诉read
使用后半部分原始缓冲区。像这样:
char buf[10];
ssize_t nread = read(0, buf, 5);
if (nread < 0)
error();
else
{
nread = read(0, buf + nread, sizeof buf - nread);
if (nread < 0)
error();
}