1

当 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 会导致分段错误。

4

2 回答 2

7

该代码只是具有未定义的行为,因为s1s2不是有效的指针。scanf需要一个指向足够大以保存读取数据的字符数组的指针,并且您没有提供这样的指针。

通常的方法是这样的:

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

scanf("%s", s1);
scanf("%s", s2);

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

于 2012-10-27T12:02:16.140 回答
0

为什么c允许在没有声明的情况下初始化字符串?

stringC中没有数据类型。

在 C 中,存储字符串的一种可能方法是使用字符数组,该数组的最后一个元素带有 a0以指示该字符串的结尾。

您的程序没有声明任何数组,而只是指向字符的指针,这些字符没有分配您使用复制数据的内存scanf()

你很幸运,程序没有在第一次调用时崩溃scanf()

于 2012-10-27T12:52:10.947 回答