使用strcpy()时出现分段错误?

我有一个全球性的结构:

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()写入的地方。 你很幸运,现在你的程序崩溃了,而不是以后。

在这两种情况下都不是编译器的错; 你必须始终确保你初始化你的指针。

  1. 确保你有足够的内存分配给你的字符串缓冲区。
  2. 远离strcpy 。 改用strncpystrcpy是缓冲区溢出漏洞的一个臭名昭着的来源 – 一个安全和维护的噩梦,其中真的没有借口。