我想用这个方法在字符串前添加零:
void addFrontzeros(char *str,int zeros) { if(zeros==0) { return; } char *temp=malloc((strlen(str)+1+zeros)*sizeof(char)); int i=0; for(;i但是当我从另一个方法调用它时,调用后字符串为空.调用者字符串在另一种方法中分配如下:
char *mul = malloc(sizeof(char)*2); mul[0]='0'; mul[1]=0;使用valgrind我收到此错误:地址0x5201b00是一个大小为2的块内的0字节
我认为问题在于realloc,但我不知道为什么它不会在这里工作
1> hobbs..:通过调用
realloc
你(可能)修改str
函数内部,但调用者addFrontzeros
没有看到新的值str
.它的旧版本仍然str
不再指向有效数据realloc
.你的函数应该
return str
(以便它可以被称为x = addFrontzeros(x, n)
)或接受一个,char **
以便它可以修改指针.正如StoryTeller所指出的,
str = realloc(str, ...)
在realloc
失败的情况下是不安全的.首先,因为你没有测试是否realloc
返回NULL
,其次,因为如果它确实返回NULL
,你有一个内存泄漏,因为旧str
的仍然被分配,但你已经丢失了指向它的指针.处理它的最小方法是char *new_str = realloc(str, strlen(temp)+1); if (!new_str) { perror("addFrontzeros: realloc"); } else { str = new_str; }虽然如果你想以其他方式处理失败,你可以,并且原件
str
仍然有效且未经修改.另一个问题是您只复制
strlen(str)
字节,其中不包括终止零字节,因此您的字符串未正确终止.用户可以自己添加终止零,或者直接将多一个字节(因为你可以假设str
是正确的终止开始).最后,作为旁注,
sizeof(char)
根据定义是1,所以乘以它是不必要的.