为什么c允许初始化字符串而不声明?

tun*_*opj 1 c pointers segmentation-fault

当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;
}
Run Code Online (Sandbox Code Playgroud)

但是使用参数作为变量,比如n1和n2,scanf读取s1给出了分段错误.

Ker*_* SB 7

该代码根本还不确定的行为,因为s1s2无效的指针.scanf期望一个指向一个字符数组的指针,它足够大以容纳读取数据,并且你没有提供这样的指针.

通常的方式是这样的:

char s1[1000];
char s2[1000];

scanf("%s", s1);
scanf("%s", s2);
Run Code Online (Sandbox Code Playgroud)

(尽管您应该使用更安全的版本来指定可用的缓冲区大小,而不是希望输入足够短;例如,scanf("%999s", s1);.)