gpt4 book ai didi

c - 如果复制字符串数组,写入套接字会导致段错误

转载 作者:行者123 更新时间:2023-11-30 16:53:11 25 4
gpt4 key购买 nike

我正在为数据通信类编写C语言程序。我正在尝试在客户端和服务器之间实现选择性拒绝。该消息经过汉明编码。

在我的客户端中,我创建了一个名为 hamming_buffer 的字符数组,其中包含带有标题、控制字符和编码数据的帧。为了实现选择性拒绝,我必须跟踪一定数量的帧。为此,我将帧保存到名为 window_buffer 的字符串数组中。

  strcpy(frame_buffer,sync); //make the first two characters in the frame SYNC  
strcpy(frame_buffer+8,sync);
char *window_buffer[DEFAULT_FRAME_SIZE]; //default frame size is 64, global to main
char frame_buffer[DEFAULT_FRAME_SIZE*8]={'0'}
...
char hamming_buffer[hammingBytesInData*8+24]; //declared within the innermost loop

当我尝试保存当前帧然后写入套接字时,出现段错误

//window_buffer[frame_counter%DEFAULT_WINDOW_SIZE]=hamming_buffer; //add hamming buffer to window_buffer
//memcpy(window_buffer[frame_counter%DEFAULT_WINDOW_SIZE],hamming_buffer,(int)sizeof(hamming_buffer)/sizeof(char));
strncpy(window_buffer[frame_counter%DEFAULT_WINDOW_SIZE],hamming_buffer,sizeof(hamming_buffer)/sizeof(hamming_buffer[0]));
//some code to introduce errors into the frame
write(sockfd,hamming_buffer,(sizeof(hamming_buffer)/sizeof(hamming_buffer[0])));

我注意到,当我删除任何复制汉明缓冲区的尝试时,我没有遇到任何问题,但是当我尝试复制时,我在尝试写入时遇到了段错误。

我在这个项目中处理过类似的问题,但是这个问题让我摸不着头脑。我最好的猜测是,我在填充 window_buffer 时以某种方式破坏了 hamming_buffer 正在使用的内存。

我在这里做错了什么。

我需要我的代码能够写入套接字而不出现段错误。

最佳答案

你有一个 64 长的 char * 数组您没有分配任何空间来存储指针可以指向的缓冲区。如果数组是本地数组,则它存储在堆栈中并且未初始化,因此指针值未定义。如果数组是静态的或外部的,则它们全部为零。理想情况下,当尝试复制第一个字节时,您会遇到段错误。但是,您可能正在复制到您有权写入的页面上,从而损坏其他数据甚至代码本身(如果可写且不与数据分离)。无论如何,当您尝试使用可能损坏的代码发送可能损坏的帧时,就会触发段错误。

您必须首先为要存储的帧分配内存。有以下三种选择:

  1. 您分配一个与帧长度相同的空间(可能首先释放或只是重新分配较旧的帧空间)。
  2. 您声明一个二维数组,其大小适合您无法处理的最大帧长度。简单,但弹性较差,浪费内存。如果它是堆栈中的自动变量,也不是一个好主意。
  3. 您为缓冲区分配空间,然后将其分配给数组位置而不是复制。如果适合您的需求,这是最佳方式。

关于c - 如果复制字符串数组,写入套接字会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40965268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com