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

使用strcpy()时出现分段错误?,c,linux,strcpy,C,Linux,Strcpy,我有一个全球结构: struct thread_data{ char *incall[10]; int syscall arg_no; int client_socket; }; 主要是() 为什么会发生这种情况,请提出解决办法 谢谢你还没有初始化指针incall[0],所以只有天知道第一个strcpy()写入到哪里。你很不幸,你的程序没有立即崩溃 您尚未初始化指向线程的指针arg\u。incall[0],因此只有天知道第二个strcpy()写入的位置。幸运的是,您的程序现在

我有一个全球结构:

struct thread_data{
   char *incall[10];
   int syscall arg_no;
   int client_socket;
};
主要是()

为什么会发生这种情况,请提出解决办法


谢谢你还没有初始化指针
incall[0]
,所以只有天知道第一个
strcpy()
写入到哪里。你很不幸,你的程序没有立即崩溃


您尚未初始化指向线程的指针
arg\u。incall[0]
,因此只有天知道第二个
strcpy()
写入的位置。幸运的是,您的程序现在崩溃,而不是以后崩溃


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

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


您尚未初始化指向线程的指针
arg\u。incall[0]
,因此只有天知道第二个
strcpy()
写入的位置。幸运的是,您的程序现在崩溃,而不是以后崩溃

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

  • 确保为字符串缓冲区分配了足够的内存
  • 远离strcpy。改用
    strncpy
    strcpy
    是一个臭名昭著的缓冲区溢出漏洞源,这是一个安全和维护方面的噩梦,真的没有任何借口
  • 确保为字符串缓冲区分配了足够的内存
  • 远离strcpy。改用
    strncpy
    strcpy
    是一个臭名昭著的缓冲区溢出漏洞源,这是一个安全和维护方面的噩梦,真的没有任何借口

  • 一个错误意味着有什么不对劲。但是,没有错误并不意味着事情没有错。如果两种情况基本相同,一种是SEGFULTS,另一种不是,这通常意味着它们都是错误的,但只有一种情况恰好触发了SEGFULTS

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

    所以一个更大的问题是为什么第一条线路没有故障?我可以想象,原因是之前内存中的任何东西都是有效的指针。因此,strcpy不会出错,它只会覆盖其他内容,这将在以后导致完全意外的行为。因此,您必须修复这两行代码


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

    segfault表示有问题。但是,没有错误并不意味着事情没有错。如果两种情况基本相同,一种是SEGFULTS,另一种不是,这通常意味着它们都是错误的,但只有一种情况恰好触发了SEGFULTS

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

    所以一个更大的问题是为什么第一条线路没有故障?我可以想象,原因是之前内存中的任何东西都是有效的指针。因此,strcpy不会出错,它只会覆盖其他内容,这将在以后导致完全意外的行为。因此,您必须修复这两行代码


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

    您在哪里分配内存来存储这些字符串?它不会自动存储在stackno中吗?分配的只是10个指针。您在哪里分配内存来存储这些字符串?它不会自动存储在stackno中,所有分配的都是10个指针“小心”?也许你的意思是“可疑”或“危险”或。。。如果由知道自己在做什么的人使用(这意味着,除其他外,源字符串有多长以及目标缓冲区中有多少空间),
    strcpy()
    是完全安全的。并不是每个人都能确保他们的安全。(有一个论点是,如果您知道字符串的长度,可以使用
    memmove()
    ,或者有时使用
    memcpy()
    ,来更有效地复制字符串。)请记住
    strncpy()
    不保证字符串的空终止。(使用
    strncat()
    更危险!)@Jonathan Leffler这是真的,但我给了不知道自己在做什么的人一些建议(我确实说过“除非使用strlen分配目标内存”)。但这是关于strncpy的一个非常好的观点——我不确定更糟的是什么:覆盖缓冲区,还是使用非空终止字符串。(我还是会说前者更糟,所以更喜欢strncpy而不是strcpy。)这很棘手。Th
    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*/