当dyn_mat的参数是常量时,代码会运行而没有任何错误,s1和s2会存储输入值。
#include<stdio.h>
int main(int argc, char const *argv[])
{
char *s1, *s2;
int n1=7, n2=8;
printf("Enter, %d \n", n1);
scanf("%s", s1);
scanf("%s", s2);
int dyn_mat[155][347];
return 0;
}
但是参数作为变量,比如n1和n2,scanf读取s1会产生分段错误。
答案 0 :(得分:7)
代码只是未定义的行为,因为s1
和s2
不是有效的指针。 scanf
需要一个指向一个字符数组的指针,这个字符大小足以保存读取数据,并且你没有提供这样的指针。
通常的方式是这样的:
char s1[1000];
char s2[1000];
scanf("%s", s1);
scanf("%s", s2);
(尽管您应该使用更安全的版本来指定可用的缓冲区大小,而不是希望输入足够短;例如,scanf("%999s", s1);
。)
答案 1 :(得分:0)
为什么c允许在没有声明的情况下初始化字符串?
C中没有数据类型string
。
在C中,存储字符串的一种可能方法是使用字符数组,此数组的最后一个元素携带0
以指示此字符串的结尾。
您的程序不会声明任何数组,而只是指向字符的指针,这些字符没有分配使用scanf()
复制数据的内存。
您很幸运,第一次拨打scanf()
时,该计划不会崩溃。