需要帮助查找 C 程序中的分段错误

Posted

技术标签:

【中文标题】需要帮助查找 C 程序中的分段错误【英文标题】:Need Help Finding Segmentation fault in C Program 【发布时间】:2022-01-17 18:06:28 【问题描述】:

我正在为一个个人学习项目实施 C 中的数据加密标准,但在过去的 3 天里,我遇到了一个段错误,这让我陷入了困境。我知道这不是“为我修复代码”类型问题的地方,但我需要第二双眼睛来看看这个:

/*we must define our own modulo, as the C modulo returns unexpected results:*/

#define MOD(x, n) ((x % n + n) % n)

/*example: the 12th bit should be in the second byte so return 1 (the first byte being 0)*/

#define GET_BYTE_NUM(bit_index) (bit_index/8)

/*example: a bit index of 12 means this bit is the 4th bit of the second byte so return 4*/ 

#define GET_BIT_NUM(bit_index) MOD(bit_index, 8)

typedef unsigned char byte;
 
/*each row represents a byte, at the bit to be place in the position
 * for example for the first row (first byte) we will place bits 31, 0, 1, 2, 3, 4 in
 * in bit positions 0-6, respectively. The last two bits will be left blank. Since this is supposed to be a crypto implementation, static prevents this value from being accessed outside the file.*/
const static byte e_box[8][6] =  31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16, 12, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24,
23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0 


void e(byte **four_byte_block)

    int i, n, l = 0, four_bit_num, four_byte_num;
    /*create the new byte_block and initialize all values to 0, we will have 4 spaces of bytes, so 32 bits in total*/
    byte *new_byte_block = (byte*)calloc(4, sizeof(byte));
    byte bit;
    for(i = 0 i < 8; i++)
    
        for(n = 0; n < 6; n++)
        
            /*get the byte number of the bit at l*/
            four_byte_num = GET_BYTE_NUM(e_box[i][n]);
            /*find what index the bit at l is in its byte*/
            half_bit_num = GET_BIT_NUM(e_box[i][n]);
   
            bit = *four_byte_block[half_byte_num]; /*SEG FAULT!*/

        
    
    /*finally, set four_byte_block equal to new_byte_block*/
    /*four_byte_block = NULL;
     * four_byte_block = new_byte_block;*/

我已将问题缩小到标记为 /SEG FAULT!/ 的行,但我看不出问题出在哪里。当我打印 half_byte_num 时,我得到一个在 half_block 范围内的数字,当我打印 half_block 的值时,我可以确认这些值存在。

我相信我可能对指针做错了,即通过传递 **four_byte_block,(指向指针的指针)并且它的操作可能导致 seg 错误。

【问题讨论】:

如果这确实是一个指向 byte 的指针,并且您确实想要来自第一个取消引用的指针的 half_byte_mark 索引值,请使用 (*four_byte_block)[half_byte_num]four_byte_block[0][half_byte_num]; 。请注意,由于我们没有正确的minimal reproducible example,这实际上是一个疯狂的猜测。提供适当的复制,我们可能可以缩小范围。 【参考方案1】:

你试过这个吗:

bit = (*four_byte_block)[half_byte_num];

而不是这个:

bit = *four_byte_block[half_byte_num];

那些不一样,举个例子,下面的代码:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main()

    char **lines = malloc(sizeof(char *) * 8);

    for (int i = 0; i < 8l; i++)
        lines[i] = strdup("hey");

    printf("%c\n", *lines[1]);
    printf("%c\n",(*lines)[1]);
    return 0;

前者将输出h。 后者会输出e

这是因为operators precedence,[]会在*之前被赋值,因此如果你想去*foo的第n个索引,你需要输入(*foo)[n]

【讨论】:

原来是这个问题,谢谢。我不敢相信这是一件如此简单的事情让我坚持了好几天。 如您所说,有时您只需要另一双眼睛。 ;) 如果您的问题得到解决,请不要忘记将答案标记为正确。

以上是关于需要帮助查找 C 程序中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

C 中 Trie 实现中的分段错误

由于 C 中的内存不足导致的分段错误

从堆栈跟踪中查找共享库中的源代码行

线程示例,分段错误

获取“分段错误核心转储”