我教师考试中常见的一个练习是使用一个函数将文本(<1000个字符)加载到一个数组中,该数组可以包含“enter”或“\ n”。
我见过其他人这样做的方法如下:
char * load (int *characters) //characters=amount of characters written
{
static char *text;
*characters=0;
while((*characters<999) && (((text[*characters]) = getchar()) != EOF))
{
++*characters;
}
text[*characters]='\0';
return(text);
}
我的问题是,在尝试输入内容时,我总是会遇到分段违规。我很乐意帮忙!
答案 0 :(得分:2)
通过text
为malloc
分配一些内存。如,
char *text = malloc(1000);
请记住使用free
在函数末尾释放内存。
<强> UPD:强> 或者,您可以考虑使用堆栈而不是堆:
static char text[1000];
请注意,在这两种情况下,您应该为字符串分配最大长度加一个字节,因为最后是'\0'
。
答案 1 :(得分:0)
无需为字符传递int指针。你的整个阵列概念似乎也很完美。有关使用char数组的方法,请参阅here。你只声明了一个char指针,但你永远不会将它指向一个内存块,这意味着一旦你开始遍历你,上帝知道在哪里并且会违反分段。
这是一个更容易关注的tutorial,它可以帮助你掌握指针/数组的情况。
答案 2 :(得分:0)
指针不是数组。
所以
static char *text;
定义一个指针,因为它是static
是一个NULL指针。下一个操作是尝试将该指针视为数组,
while((*characters<999)&&(((text[*characters])=getchar())!=EOF))
给出了未定义的行为。实际上,结果通常是覆盖一些随机的内存区域。操作系统 - 如果他们检测到 - 将终止您的程序(在您的情况下,这意味着触发分段违规)。
使text
静态无关紧要。如果没有static
关键字,那么所有发生的事情都是text
在程序运行时自动创建,并且在返回后不存在。在这种情况下,它将是uninitiatialised(这意味着即使访问它的值也会给出未定义的行为)。
您需要做的是将text
指向内存中的有效位置。由于您返回其值,因此该值必须在函数返回后有效。一种方法是
char text = malloc(999 + 1);
只要输入不超过999
个字符,就可以了。调用者还必须释放该内存以避免内存泄漏。
此外,getchar()
会返回int
。 int
可以代表EOF
的值。无法保证char
可以。因此,分配(text[*characters])=getchar()
意味着该值(因为它已被转换为char
)可能永远不会与EOF
相等。