校验和函数C中的分段错误

时间:2017-04-12 17:13:27

标签: c

当我尝试对我的校验和功能进行测试时,我不断遇到分段错误。

int cksum(int *buf, int count) {
    long sum = 0;
    //if(count%2 == 1) { //if we are passing an odd number of bytes
    //  buf = strncat (*buf, '\0', 1);
    //} 
    while (count) {
        sum += *buf++;
        if (sum & 0xFFFF0000) { /* carry occurred, so wrap around */
            sum &= 0xFFFF;
            sum++;
        }
        count--;
    }
    return  ~(sum & 0xFFFF);
}

测试功能:

char poo[6] = {'c', 'b', '1', '3' , '4', 'a'}; 
int my_check_value = cksum(poo, 6);

我收到错误:分段错误(核心转储)

我真的不确定函数在哪里出错了,因为我非常简单地实现了它。谢谢!

3 个答案:

答案 0 :(得分:2)

问题是intchar之间的大小差异。

你将一个大小为6字节的内存块传递给函数,因为每个char只有1个字节。但是该函数期望将内存分组为int,这是4个字节,并且您告诉函数其中有6个,这意味着总共24个字节。

您希望如何继续进行取决于您,但您的当前使用情况中的功能应该采用char *代替int *似乎合乎逻辑?

答案 1 :(得分:1)

conda正在指向int cksum(int *buf, int count)作为参数。电话

int

正在传递int my_check_value = cksum(poo, 6); 数组。

答案 2 :(得分:1)

你正在将char poo[6]作为int *buf传递,这会破坏你所有的指针算术。将poo更改为int,或将buf指定为char *