我是C的新手,正在尝试使用read函数。我想把缓冲区中的内容(tempChar(放在另一个char数组(str(中。这样我就可以再次运行read函数,稍后再添加到str中(因为tempChar将被第二个read函数重写(。像这样:
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;
它编译得很好,但当我真正尝试运行它时,它会给我一个分段错误
有什么想法吗?非常感谢。
您需要有足够的存储空间来存储正在读取的10个字符
你申报了
char tempChar
可以容纳1个字符。
相反,将tempChar声明为
char tempChar[10];
char tempChar;
read(0, &tempChar, 10);
您正在将文件中的10个字符读取到只有一个字符大小的内存中char tempChar
仅为单个字符保留存储器;tempChar指向这一单个字节的内存。
char *str;
str= (char*) malloc(10);
// why not now do ?
read(0, str, 10);
char tempChar;
只分配1个字节。所以你只能保持1个字符。当您memcpy()
时,您请求复制10个不存在的字节。因此,当你读取记忆时,你不应该引起未定义的行为(这会给你SegFault(。
您应该像对待str的malloc()
那样做一些事情,或者声明一个类似char chatTemp[10]
的本地数组。注意:malloc()
不需要C.转换。
如果您想读取两次并将结果放在同一缓冲区中,则不需要临时缓冲区:您可以使用指针算术来告诉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();
}
您需要提供一个文件描述符作为读取函数的第一个参数。。此外,您需要分配char * buffer
而不是char tempChar;
检查样本使用情况