我有一个全球性的结构:
struct thread_data{ char *incall[10]; int syscall arg_no; int client_socket; };
和main()
char buffer[256]; char *incall[10]; struct thread_data arg_to_thread; strcpy(incall[0],buffer); /*works fine*/ strcpy(arg_to_thread.incall[0],buffer); /*causes segmentation fault*/
为什么会发生这种情况,请提出一条出路。
谢谢
段错误意味着什么是错的。 但没有段错误并不意味着没有错。 如果两种情况基本相同,一个段错误,另一个段错,通常意味着它们都是错的,但是其中只有一个碰巧触发了段错误。
看着char* incall[10]
这一行,这意味着你有一个指向char的10个指针的数组。 默认情况下,这些指针将随机指向。 因此,strcpying into incall [0]会将字符串复制到一个随机位置。 这很可能会segfault! 您需要首先初始化incall [0](使用malloc
)。
所以更大的问题是为什么第一行段错误? 我可以想象,原因就在于以前的记忆是一个有效的指针。 因此,strcpy不会出现段错误,只会覆盖其他会导致完全意外行为的其他内容。 所以你必须修复这两行代码。
另一个问题(一旦你已经解决了这个问题)是strcpy
本身是非常危险的 – 因为它复制字符串,直到它找到一个0字节,然后停止,你永远不能确定究竟要复制多少(除非你使用strlen
分配目标内存)。 所以你应该使用strncpy
来限制复制到缓冲区大小的字节数。
你还没有初始化指针incall[0]
,所以善良只知道第一个strcpy()
写入的地方。 你不幸的是,你的程序不会立即崩溃。
你还没有初始化指针arg_to_thread.incall[0]
,所以善良只知道第二个strcpy()
写入的地方。 你很幸运,现在你的程序崩溃了,而不是以后。
在这两种情况下都不是编译器的错; 你必须始终确保你初始化你的指针。
strcpy
。 改用strncpy
。 strcpy
是缓冲区溢出漏洞的一个臭名昭着的来源 – 一个安全和维护的噩梦,其中真的没有借口。