You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现bzero函数出现段错误但同逻辑memset正常是何原因?

C语言自定义bzero函数段错误问题排查

我尝试重写一个bzero函数时出现了段错误,用完全相同的方法实现的同类memset函数运行完全正常,一开始没有发现二者的差异。

问题相关代码

报错的bzero实现及测试代码

#include <stdlib.h>
    
void    ft_bzero(void   *b, size_t len)
{
    size_t i;
    unsigned char *mem;
    unsigned char s;

    mem = b;
    s = '\0';
    i = 0;
    while (i < len)
    {
        mem[i] = s;
        i++;
    }
}

#include <stdio.h>
int main(void)
{
    char *b = "bzero";
    
    ft_bzero(b, 4);
    return (0);
}

运行正常的memset实现及测试代码

#include <stdlib.h>
    
void    *ft_memset(void *dest,  int c, size_t len)
{
    size_t  i;
    unsigned char   s;
    unsigned char   *mem;

    mem = dest;
    s = c;
    i = 0;
    while (i < len)
    {
        mem[i] = s;
        i++;
    }
    return (dest);
}

#include <stdio.h>
#include <string.h>
  
int main()
{
    char str[50] = "testing the c ft_memset";
    printf("\nBefore memset(): %s\n", str);
  
    ft_memset(str + 13, '.', 8*sizeof(char));
  
    printf("After memset():  %s", str);
    return (0);
}

问题原因及解决方案

段错误的根源是测试代码的变量定义方式错误:char *b = "bzero"定义的是字符串常量,存储在进程的只读内存段,不允许被修改,调用ft_bzero尝试写入该地址就会触发段错误。而memset的测试代码中char str[50] = "testing the c ft_memset"是在栈上申请的可写字符数组,所以可以正常写入。

将bzero的测试代码修改为栈数组的定义方式即可解决问题:
原错误测试代码:

int main(void)
{
    char *b = "bzero";
    
    ft_bzero(b, 4);
    return (0);
}

修改后的正确测试代码:

int main(void)
{
    char b[5] = "bzero";
    
    ft_bzero(b, 4);
    return (0);
}

内容的提问来源于stack exchange,提问作者JcesarIA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:06:04