我正在尝试用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;
}
下面显示的文件是接收方要读取数据的发送方文件。 通过使用大小的数组它正常工作,但我喜欢使用指针。 此代码中的主要变量:
例: 数据: 01110000 parity_bit_array: 1 data_to_send: 01110000 1
答案 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)
有很多问题:
} while( !data);
错误,您应该使用:} while( *data != 0);
这可能间接导致分段错误(如果幸运的话)使代码循环不确定。
内存未分配给*parity_bit_array
和*data_to_send
。
访问未分配的内存是未定义的行为,可能导致任何问题,包括分段错误。
write(fd,data_to_send,sizeof(data_to_send));
应该是write(fd,data_to_send,sizeof(*data_to_send));
或类似的东西,根据您的逻辑。