如何解决为什么重新分配错误线程 1:信号 SIGABRT
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/uio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdarg.h>
void debug(void);
char * string(const char * );
char * strcats(const char *,const char * );
char * strspe(const char *,...);
int isDir(const char *);
int main(void){
debug();
return 0;
}
void debug(void){
char * str = "ssssss";
str = string("abcdef");
char * hello;
hello = strspe(str,"hello","world",NULL);
printf("hello: %s,Address: %p\n",hello,(char *)hello);
}
char * string(const char * str){
return strcpy(malloc(strlen(str) * sizeof(char) + sizeof(char)),str);
}
char * strcats(const char * str1,const char * str2){
int realSize = (int)strlen(str2) * sizeof(char) + (int)strlen(str1) * sizeof(char) + sizeof(char);
str1 = realloc((char *)str1,realSize);
strcat((char *)str1,str2);
return (char *)str1;
}
char * strspe(const char * format,...)
{
va_list args;
const char * argv;
char * result = string(format);
//free((char*)format);
va_start(args,format);
while((argv = va_arg(args,const char *)) && argv != NULL){
strcats((char *)result,argv);
}
va_end(args);
return result;
}
int isDir(const char *filename){
return (access(filename,0) == 0);
}
这是一段C代码,有时运行有时不运行并给出错误线程1:信号SIGABRT。
Debug (23028,0x1000ebe00) malloc: *** error for object 0x1007af200: 指针是 realloc 的 d 没有分配 Debug (23028,0x1000ebe00) malloc: *** 在malloc_error_break 中设置断点以调试(23028,0x1000ebe00) (lldb)
并将光标聚焦在第 37 行:
str1 = realloc((char *)str1,realSize);
我无法解决问题
解决方法
问题在这个循环中:
while((argv = va_arg(args,const char *)) && argv != NULL) {
strcats((char *)result,argv);
}
strcats
重新分配与 result
关联的内存(名为 str1
的参数),但 realloc
可能会更改地址。您正确返回了新地址但从未使用过它,因此 result
永远不会更改。然后在给定的时间,当 realloc
将数据移动到另一个地方时,前者不再有效,在下一个循环中再次发送错误地址。
更改为:
while((argv = va_arg(args,const char *)) && argv != NULL){
result = strcats(result,argv);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。