垂直冗余校验中的分段故障

时间:2015-03-03 12:10:58

标签: c pointers error-detection

我正在尝试用C语言编写程序进行垂直冗余校验。守则如下:

#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>

    int main()
    {
        int fd,i;
        char *data = "01010101010111110101010101011111";
        int count = 0,bit_count=0;
        char *parity_bit_array = NULL;
        char *data_to_send = NULL;
        char *stream_name = "Named Stream";
        do
        {
            if(*data == '1' && bit_count <= 8)
            {
                count++;
                if(bit_count == 8) 
                {
                        if( count % 2 == 0)
                        {
                            *parity_bit_array = '1';
                            count = 0;
                            bit_count = 0;
                        }
                        else
                        {
                            *parity_bit_array = '0';
                            count = 0;
                            bit_count = 0;
                        }
                }
            }
            bit_count++;
            data++;
        } while( !data);
        do
        {
            if(bit_count <= 8)
            {
                *data_to_send++ = *parity_bit_array++;
            }
            *data_to_send++ =  *data;
        } while( !data );
        printf("%s \n",data_to_send);
        mkfifo(stream_name,0666);
        fd = open(stream_name,O_WRONLY);
        write(fd,data_to_send,sizeof(data_to_send));
        close(fd);
        unlink(stream_name);
        return 0;
    }

下面显示的文件是接收方要读取数据的发送方文件。 通过使用大小的数组它正常工作,但我喜欢使用指针。 此代码中的主要变量:

  1. 数据:要实施VRC的数据
  2. 计数:偶数奇偶校验位计数1
  3. bit_count :计算8位
  4. parity_bit_array :收集数据中每个字节的奇偶校验位
  5. data_to_send :数据组合+ parity_bit_array
  6. 例: 数据: 01110000 parity_bit_array: 1 data_to_send: 01110000 1

2 个答案:

答案 0 :(得分:1)

你没有为你的char指针分配内存,你正试图写入它们,这将导致未定义的行为,从而导致分段错误。

 *parity_bit_array = '1';

此代码中有多个此类案例。

 char *data_to_send = NULL;

data_to_send指针永远不会分配内存,你尝试写入它

*data_to_send++ = *parity_bit_array++;

将内存分配给char指针,如

 char *data_to_send = malloc(20);

如果您已经写入20个字节,则写入此数组时,只需为同一个内存执行realloc()

char *temp = realloc(data_to_send,40);
if(temp != NULL)
data_to_send = temp;

答案 1 :(得分:1)

有很多问题:

  1. } while( !data);错误,您应该使用:} while( *data != 0);

    这可能间接导致分段错误(如果幸运的话)使代码循环不确定。

  2. 内存未分配给*parity_bit_array*data_to_send。 访问未分配的内存是未定义的行为,可能导致任何问题,包括分段错误。

  3. write(fd,data_to_send,sizeof(data_to_send));应该是write(fd,data_to_send,sizeof(*data_to_send));或类似的东西,根据您的逻辑。