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

とは有効なポインタではないため、コードの動作は未定義です。読み取りデータを保持するのに十分な大きさのcharの配列へのポインターを想定しており、そのようなポインターを提供していません。s1s2scanf

通常の方法は次のようになります。

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では、文字列を格納する1つの可能な方法は、文字の配列を使用することです。この配列の最後の要素には0、この文字列の終わりを示すaが付いています。

プログラムは配列を宣言しませんが、を使用してデータをコピーするためのメモリが割り当てられていない文字へのポインタのみを宣言しますscanf()

幸運なことに、プログラムは最初の呼び出しでクラッシュしませんscanf()

于 2012-10-27T12:52:10.947 に答える