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

时间:2011-06-09 05:56:42

标签: c linux 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*/

为什么会发生这种情况,请提出建议。

感谢

3 个答案:

答案 0 :(得分:5)

段错误意味着出了问题。但是没有段错误并不意味着不是错误。如果两种情况基本相同,一种是段错误,另一种则不然,则通常意味着它们错误,但只有其中一种碰巧触发了段错误。

查看第char* incall[10]行,这意味着您有一个包含10个指向char的指针的数组。默认情况下,这些指针将指向随机位置。因此,strcpying到incall [0]将把字符串复制到随机位置。这很可能会出现段错误!您需要首先初始化incall [0](使用malloc)。

更大的问题是为什么第一行segfault?我想象的原因是恰好发生以前内存中的任何东西都是有效的指针。因此,strcpy不会出现段错误,它只会覆盖其他会导致完全意外行为的内容。因此,您必须修复两行代码行。

另一个问题(一旦你解决了这个问题)是strcpy本身非常危险 - 因为它复制字符串直到它找到0字节然后停止,你永远无法确定它到底有多少复制(除非您使用strlen分配目标内存)。因此,您应该使用strncpy来限制复制到缓冲区大小的字节数。

答案 1 :(得分:1)

您尚未初始化指针incall[0],因此良好只知道第一个strcpy()写入的位置。你不幸的是你的程序不会立即崩溃。

您尚未初始化指针arg_to_thread.incall[0],因此良好只知道第二个strcpy()写入的位置。你很幸运,你的程序现在崩溃了,而不是以后崩溃。

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

答案 2 :(得分:0)

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