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"));
它会导致任何内存问题吗?据我了解,我可能面临的唯一问题是堆栈溢出,对吧?
问题是,对于strcat
,第一个参数将用于存储结果,因此它必须足够大以包含连接的结果字符串。
在您的示例中,第一个参数是字符串文字,不能修改,更不用说有足够的空间。
它会导致任何内存问题吗?
是的,这是未定义的行为,因此可能会导致崩溃。
据我了解,我可能面临的唯一问题是堆栈溢出,对吧?
不,这里的问题是strcat
它将尝试写到字符串文字的末尾。
您可以按如下方式修复您的程序:
// Copy into writable memory, and give enough space to fit ".binary"
char fileTxt[16] = "file.txt";
foo(strcat(fileTxt,".binary"));
此外,对于字符串文字,如果您只是将它们一个接一个地放置,编译器将为您进行连接:
foo("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
您正试图复制一个字符串常量,该常量通常位于只读内存中。
第二个字符串的初始字节覆盖第一个字符串的空字节。所以第一个字符串(除了不是上面提到的字符串文字)应该足够大以容纳两个字符串的所有字符以及字符串字符的结尾。此外,字符串不应重叠。