使用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()
写入的位置。幸运的是,您的程序现在崩溃,而不是以后崩溃
这两种情况都不是编译器的错;必须始终确保初始化指针
strncpy
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*/