use*_*086 0 c string pointers realloc
我想用这个方法在字符串前添加零:
void addFrontzeros(char *str,int zeros)
{
if(zeros==0)
{
return;
}
char *temp=malloc((strlen(str)+1+zeros)*sizeof(char));
int i=0;
for(;i<zeros;i++)
{
temp[i]='0';
}
int j=0;
for(;j<strlen(str);j++)
{
temp[j+zeros]=str[j];
}
temp[strlen(str)+zeros]=0;
str=realloc(str,(strlen(temp)+1)*sizeof(char));
strcpy(str,temp);
free(temp);
}
Run Code Online (Sandbox Code Playgroud)
但是当我从另一个方法调用它时,调用后字符串为空.调用者字符串在另一种方法中分配如下:
char *mul = malloc(sizeof(char)*2);
mul[0]='0';
mul[1]=0;
Run Code Online (Sandbox Code Playgroud)
使用valgrind我收到此错误:地址0x5201b00是一个大小为2的块内的0字节
我认为问题在于realloc,但我不知道为什么它不会在这里工作
通过调用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;
}
Run Code Online (Sandbox Code Playgroud)
虽然如果你想以其他方式处理失败,你可以,并且原件str仍然有效且未经修改.
另一个问题是您只复制strlen(str)字节,其中不包括终止零字节,因此您的字符串未正确终止.用户可以自己添加终止零,或者直接将多一个字节(因为你可以假设str 是正确的终止开始).
最后,作为旁注,sizeof(char)根据定义是1,所以乘以它是不必要的.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |