我想使用内存分配将字符串写入FILE
,我希望流接受输入尽可能多。为了做到这一点,在用户按下 Ctrl - Z 之前,字符数组会越来越大。
但我的代码无法正常工作,我不知道为什么!
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
size_t index=0, newsize=0;//are used for reallocating
int ctrl=1;//Primary value for CTRL for going through while loop
char *sentence , singlechar;
sentence=(char*)malloc(1*sizeof(char));
FILE *fptr;
fptr=fopen("E:\\Textsample.txt","w");
if(fptr==NULL)
{
free(fptr);
puts("Error occurs when trying to allocate memory.");
exit(EXIT_FAILURE);
}
singlechar=getchar();
sentence[index]=singlechar;
while((ctrl=getchar())!=EOF)
{
/**Making sentence bigger**/
newsize++;
realloc(sentence,newsize);
if(sentence==NULL)
{
free(sentence);
puts("Error occurs when trying to reallocate memory.");
exit(EXIT_FAILURE);
}
/**Putting inputed character into sentence**/
index++;
singlechar=(char) ctrl;
/*Check if it is EOF*/
if((int) ctrl==EOF)
{
free(sentence);
puts("EOF Reached.");
exit(EXIT_SUCCESS);
}
else
{
sentence[index]=singlechar;
fwrite(sentence,sizeof sentence[0],newsize,fptr);
}
}
free(fptr);
return EXIT_SUCCESS;
}
我感谢任何帮助。
答案 0 :(得分:0)
这里的想法是错误的。您提出的方法是浪费CPU和内存alloc / realloc。这里的问题是 <View pointerEvents={'none'}>
<Image
pointerEvents={'none'}
style={{
position: 'absolute',
bottom: 0,
left: 0,
right: 0,
height: 100,
opacity: 0.8
}}
source={require('Project/assets/1.0/Screen1.0.2/bottom-gradient.png')}
/>
</View>
。此调用是源字节的realloc(sentence, 1);
线性副本。每次输入某个字符时逐个添加字节会使您的总分配过程O(n)
更差。
什么阻止我使用你的技术只是继续输入并运行你的系统内存?
此外,最佳做法是分配一个基本数组(比方说128个字节?)并使其以指数方式增长。
哦,并且,没有投出O(n^2)
电话的结果。这是非常难看的代码和无用的。
我会建议像
这样的东西malloc
答案 1 :(得分:0)
你现在正在做什么(除了在NULL指针和文件描述符上调用free之外 - 不做其中任何一个)是按字符读取输入,将它存储在一个数组中(每次调整大小时都会调整它)大小1 - 我猜你的意思是索引+ 1,这仍然是非常低效的)并将第一个字符写入文件。
我没有运行代码,但我看到SEGFAULT至少有3个点,如上所述。
你要做什么,是读取缓冲区的输入(任意大小的数组,在这种情况下根本不需要调整大小),一旦缓冲区满了或你点击EOF - 写入文件并将索引重置为0.