0

我有一个全局结构:

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*/

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

谢谢

4

3 回答 3

5

段错误意味着有问题。但是没有段错误并不意味着没有错误。如果两种情况基本相同,一种是segfault,另一种不是,通常说明两者都错了,但恰好只有一种情况触发了segfault。

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

所以一个更大的问题是为什么第一行没有段错误?我想原因是碰巧之前内存中的任何内容都是有效的指针。因此, strcpy 不会出现段错误,它只是覆盖其他内容,这会在以后导致完全意外的行为。所以你必须修复这两行代码。

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

于 2011-06-09T06:03:47.187 回答
1

您还没有初始化指针incall[0],所以善良只知道第一个strcpy()写入的位置。你很不幸你的程序没有立即崩溃。

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

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

于 2011-06-09T06:00:43.650 回答
0
  1. 确保为字符串缓冲区分配了足够的内存。
  2. 远离strcpy。改为使用strncpystrcpy是缓冲区溢出漏洞的臭名昭著的来源 - 一个安全和维护的噩梦,真的没有任何借口。
于 2011-06-09T06:01:37.083 回答