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
相关产品推荐
相关产品推荐

