1

void foo (char* fileName);次の呼び出しで関数を呼び出すとします

foo("file.txt");

電話しても大丈夫ですかfoo():

foo(strcat("file.txt",".binary"));

それはメモリの問題を引き起こしますか?私が直面できる唯一の問題はスタックオーバーフローですよね?

4

4 に答える 4

1

クラッシュします。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

多くの場合、読み取り専用メモリにある文字列定数をコピーしようとしています。

于 2013-08-24T12:10:46.047 に答える
1

2 番目の文字列の最初のバイトは、最初の null バイトを上書きします。したがって、最初の文字列 (上記の文字列リテラルではないことを除けば) は、両方の文字列のすべての文字と文字列の末尾の文字を保持するのに十分な大きさである必要があります。また、文字列が重なってはいけません。

于 2013-08-24T12:10:55.113 に答える