我有一个全球结构:
struct thread_data{
char *incall[10];
int syscall arg_no;
int client_socket;
};
Run Code Online (Sandbox Code Playgroud)
并在主()
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*/
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,请提出建议.
谢谢
段错意味着出了问题.但是,没有任何段错并不意味着没有错.如果两种情况都基本相同,和一个内存设计缺陷和其他没有,这通常意味着他们都错了,但只有其中一个恰好是触发段错误.
看看这一行char* incall[10],这意味着你有一个10个指向char的数组.默认情况下,这些指针将指向随机位置.因此,strcpying到incall [0]将把字符串复制到随机位置.这很可能会出现段错误!您需要首先初始化incall [0](使用malloc).
所以一个更大的问题是为什么第一行不是段错误?我想象的原因是它恰好发生在内存之前的任何东西都是一个有效的指针.因此,strcpy不会出现段错误,它只会覆盖其他会导致完全意外行为的内容.所以你必须修复两行代码.
另一个问题(一旦你修复了它)strcpy本身就非常危险 - 因为它复制字符串直到找到0字节然后停止,你永远无法确定要复制多少(除非你strlen用来分配目的地记忆).因此,您应该使用strncpy,以限制复制到缓冲区大小的字节数.
| 归档时间: |
|
| 查看次数: |
3960 次 |
| 最近记录: |