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

时间:2012-10-27 11:59:21

标签: 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;
}

但是参数作为变量,比如n1和n2,scanf读取s1会产生分段错误。

2 个答案:

答案 0 :(得分:7)

代码只是未定义的行为,因为s1s2不是有效的指针。 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()时,该计划不会崩溃。

相关问题