void foo (char* fileName);
次の呼び出しで関数を呼び出すとします
foo("file.txt");
電話しても大丈夫ですかfoo()
:
foo(strcat("file.txt",".binary"));
それはメモリの問題を引き起こしますか?私が直面できる唯一の問題はスタックオーバーフローですよね?
void foo (char* fileName);
次の呼び出しで関数を呼び出すとします
foo("file.txt");
電話しても大丈夫ですかfoo()
:
foo(strcat("file.txt",".binary"));
それはメモリの問題を引き起こしますか?私が直面できる唯一の問題はスタックオーバーフローですよね?
クラッシュします。OSX では、次のようになります。
$ ./a.out
Abort trap: 6
次のスタック トレースを使用します。
0 libsystem_kernel.dylib 0x00007fff8ad85866 __pthread_kill + 10
1 libsystem_pthread.dylib 0x00007fff83cb136c pthread_kill + 92
2 libsystem_c.dylib 0x00007fff8455dbba abort + 125
3 libsystem_c.dylib 0x00007fff8455dd31 abort_report_np + 181
4 libsystem_c.dylib 0x00007fff845818c5 __chk_fail + 48
5 libsystem_c.dylib 0x00007fff845818d5 __chk_fail_overlap + 16
6 libsystem_c.dylib 0x00007fff845818f7 __chk_overlap + 34
7 libsystem_c.dylib 0x00007fff84581c29 __strcat_chk + 81
8 a.out 0x0000000105c63f09 main + 57
9 libdyld.dylib 0x00007fff8f2255fd start + 1
多くの場合、読み取り専用メモリにある文字列定数をコピーしようとしています。
2 番目の文字列の最初のバイトは、最初の null バイトを上書きします。したがって、最初の文字列 (上記の文字列リテラルではないことを除けば) は、両方の文字列のすべての文字と文字列の末尾の文字を保持するのに十分な大きさである必要があります。また、文字列が重なってはいけません。