我是C的新手,我创建了以下代码,但运行时程序崩溃了。为什么?如何阻止它崩溃?
char *get()
{
char *n;
printf("\n user name : ");
scanf("%s", &n);
return n;
}
int main()
{
char *c = get();
printf("%s", c);
return 0;
}
答案 0 :(得分:4)
在C中,父级通常会处理内存分配,因为没有垃圾收集器可以自行清理,所以无论如何都必须这样做:
void get(char *n)
{
printf("\n user name : ");
scanf("%s", n);
}
int main()
{
char c[200];
get(c);
printf("%s", c);
return 0;
}
答案 1 :(得分:3)
scanf
正在读取stdin
中的字符并将其存储在n
指向的内存中。您尚未初始化n
指向任何内容,因此scanf
可能会尝试将您的输入存储在内存中的某个任意位置。你很幸运它崩溃而不是安静地表现得好像它正常工作一样。
从C函数返回一个字符串比你想象的要复杂得多。
有(至少)三种一般方法:
要求调用者传入指向要存储字符串的数组(的第一个元素)的指针,以及另一个告诉函数该数组有多大的参数。如果数组不足以容纳结果,则可能需要进行错误处理。
在函数内声明一个static
数组并返回指向它的指针。 (您不能返回指向非静态本地数组的指针,因为当函数返回时,数组不再存在。)问题:多个调用使用相同的存储空间(在存在线程时尤其有问题),并且已分配大小是固定的。
使用malloc()
在函数内分配结果。这要求来电者free()
得到结果。
推荐阅读:comp.lang.c FAQ。特别是,问题7.5b几乎是你问题的直接答案(如果我早些时候意识到这一点,我会为我节省一些打字)。 (我通常不会链接到个别问题,因为我喜欢鼓励人们浏览。)
编辑:此外,scanf
格式不合格"%s"
本质上也不安全。它将尝试存储但是在数组中输入了许多字符;没有办法避免缓冲区溢出(例如,如果你的猫坐在键盘上)。 @Artefacto在评论链接中提到了这个问题。
答案 2 :(得分:1)
首先,你要为你的字符串分配内存
您可以使用malloc;
动态地执行此操作例如,尺寸为200 :
#include <stdlib.h>
char (*n)[200] = malloc(sizeof *n);
不要忘记用
解放指针free(n);