垂直冗余检查中的分段错误
Segmentation Fault in Vertical Redundancy Check
我正在尝试用 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;
}
下图为发送方文件,接收方需要读取其中的数据。
通过使用大小数组,它可以正常工作,但我喜欢将它与 Pointer 一起使用。
此代码中的主要变量:
- data : 实现VRC的数据
- count : 为偶校验位计数 1
- bit_count:计算 8 位
- parity_bit_array:为数据中存在的每个字节收集奇偶校验位
- data_to_send : 数据+parity_bit_array
的组合
例如:
数据: 01110000
parity_bit_array : 1
data_to_send : 011100001
您没有为您的 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;
存在多个问题:
} 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));
或者按照你的逻辑类似的东西。
我正在尝试用 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;
}
下图为发送方文件,接收方需要读取其中的数据。 通过使用大小数组,它可以正常工作,但我喜欢将它与 Pointer 一起使用。 此代码中的主要变量:
- data : 实现VRC的数据
- count : 为偶校验位计数 1
- bit_count:计算 8 位
- parity_bit_array:为数据中存在的每个字节收集奇偶校验位
- data_to_send : 数据+parity_bit_array 的组合
例如: 数据: 01110000 parity_bit_array : 1 data_to_send : 011100001
您没有为您的 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;
存在多个问题:
} 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));
或者按照你的逻辑类似的东西。