可能重复:
尝试在结构上使用 scanf 时出现分段错误
我是 C 编程新手,并且有以下代码。
char *s;
scanf("%s",s);
printf("This is s %s",s);
上面的代码行导致了分段错误。你能解释一下为什么吗?是否有一些文章可以让我阅读以更深入地理解这些概念?
可能重复:
尝试在结构上使用 scanf 时出现分段错误
我是 C 编程新手,并且有以下代码。
char *s;
scanf("%s",s);
printf("This is s %s",s);
上面的代码行导致了分段错误。你能解释一下为什么吗?是否有一些文章可以让我阅读以更深入地理解这些概念?
您可以写入该特定实体 拥有的内存地址。
例如:
char s[10];
编译器保留足够的内存来存储10
字符s
,您可以自由地对其进行写入。
当你说:
char *s;
指针s
只是指向一些不属于它或为其保留的随机内存地址。写入该内存地址会导致写入某个其他实体拥有的内存。从技术上讲,这是未定义的行为。
实际上,可能会发生或不发生段错误,具体取决于写入的内存地址是否属于某个其他实体。因此,您很幸运遇到了引起您注意的崩溃。无论如何,这是未定义的行为,因此应始终避免。
您需要为指针分配内存以便能够对它进行任何有意义的操作。无论是堆栈上的内存还是堆上的内存,但它应该是拥有的,因此可以写入。
使用 fgets 使用数组和指针尝试此操作:
static void get_input()
{
/* Array of 32 btyes long - no input can be 32 characters in total */
#define CHAR_SIZE 32
char str_array[CHAR_SIZE];
char *str_ptr = calloc(sizeof(char), CHAR_SIZE);
/* Get input from user - limit the input to 32 bytes using fgets which is safer */
printf("Please enter something: ");
/* Clear the memory before using it */
memset(str_array, 0, CHAR_SIZE);
fgets(str_array, CHAR_SIZE, stdin);
printf("The input was [ %s ]\n", str_array);
/* Doing the same thing with a pointer */
printf("Please enter something again: ");
fgets(str_ptr, CHAR_SIZE, stdin);
printf("The input again was [ %s ]\n", str_ptr);
/* free memory */
free(str_ptr);
}
希望能帮助到你,
指针存储地址。并且该地址应该始终是某些保留内存的地址。
意思是做完之后char *s
。您需要使用malloc
或为其保留/分配一些内存calloc
。
char *s=malloc(10*sizeof(char));
假设 char 的大小为 1 个字节,这将分配 10 个字节的内存。请记住,free
完成目的后,您需要使用免费功能分配的内存。
您已经创建了一个指针,但现在它未初始化(可能指向您无权访问的某个位置)。
char *s;
要么将其声明为数组
char s[20]; //this number should be big enough to hold the input
或者分配一些内存然后指向它。
char *s = (char *) malloc (20*sizeof(char));
参考:scanf