問題は、あなたがmalloc
をどのように使用しているかにあります。あなたは十分なメモリを割り当てていないので、割り当てるメモリの量を知ることはできません。
strings=malloc(r*sizeof(strings));
これはr
文字ポインタためstrings
に十分なメモリを割り当てます。 strings
は、の変数r
を安全に保存できるようになりました。問題はstrings
に格納されている文字列にメモリを割り当てないことです。
void func(char *p[],int r)
{
int i;
for(i=0;i<r;i++)
/* At this point, p[i] is unallocated */
scanf("%s",p[i]);
}
p[i]
実際に文字列を格納するものも割り当てられなければならない。いくら?あなたが知っているのは、scanf
を使って入力から読んでいるということです。だから、最初のカットは、固定サイズを割り当てて、そのサイズで読み込みます(ヌル文字のために1つしかない)。
void func(char *p[],int r)
{
int i;
for(i=0; i < r; i++) {
p[i] = malloc(256 * sizeof(char));
scanf("%255s",p[i]);
}
}
最大長他入力はあなたが割り当てられたメモリよりも大きくすることができずにscanf %s
を使用しないでください。またdon't use scanf
の場合、入力があなたのパターンと一致しないと困ることがあります。必要に応じて、getline
またはfgets
で全体の行を読み取ってからsscanf
を読む方がよいでしょう。
Cでコーディングするときは、メモリチェッカーが絶対に必要です。これらの問題が発生します。私はvalgrindを使用します。
Enter the no. of rows :5
foo
==10082== Use of uninitialised value of size 8
==10082== at 0x1001F2121: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==10082== by 0x1001EA979: scanf (in /usr/lib/system/libsystem_c.dylib)
==10082== by 0x100000F2B: func (test.c:19)
==10082== by 0x100000EBD: main (test.c:11)
==10082==
==10082== Invalid write of size 1
==10082== at 0x1001F2121: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==10082== by 0x1001EA979: scanf (in /usr/lib/system/libsystem_c.dylib)
==10082== by 0x100000F2B: func (test.c:19)
==10082== by 0x100000EBD: main (test.c:11)
==10082== Address 0x0 is not stack'd, malloc'd or (recently) free'd
これらはメモリの問題を指すスタックトレースです。 "サイズ8の初期化されていない値を使用すると"文字列にメモリを割り当てられなかったことがわかります。スタックはscanf
がfunc
であると私に伝えます。
なぜC++としてタグ付けされていますか? – Slava
質問を編集して、入力した正確な入力、得られた出力、予想した出力を追加できますか?コードがどのように機能するのかを理解する必要があります。 –
成熟した言語としての親しみやすさと、Cとして間違ってしまうのは簡単です。「コンパイラが壊れています」というバリエーションは最後の手段です。おそらくそれはあなたのコードです。 – Schwern