如何解决为什么我不能返回 realloc 的结果? 当你看到代码时,你会得到问题......
任务是制作 2 个不同的函数。 1 其中 malloc 为 char 创建一个长度并放入它们的 2 个字符串。另一个函数不能给出返回类型。它应该改变 2 个融合字符串的长度以适应第三个字符串。但在某些情况下,它并没有给出应有的结果。第一个“失败”应该是一个,但其他三个不应该是一个......
#include <stdlib.h>
#include <string.h>
char *concatStrings( char* concaStr,char*str);
void concatStrings2( char* newString,char*str);
void testConcatStrings(char* concaStr,char*str,char*str2,char*expected);
int main()
{
char *str="Dynamic";
testConcatStrings("Memory",str,"Management","DynamicMemoryManagement");
testConcatStrings("Memory ","DynamicMemoryManagement");
testConcatStrings("Memory","","DynamicMemory");
testConcatStrings("Memory","MemoryManagement");
testConcatStrings("","DynamicManagement");
testConcatStrings("Memory","Memory");
testConcatStrings("",str);
testConcatStrings("","Management");
testConcatStrings("","");
return 0;
}
char *concatStrings( char* concaStr,char*str){
//calculate suze for memory...
int lenStr=strlen(str);
int lenConcaStr=strlen(concaStr);
//+1 byte for 0x00
int len=lenStr+lenConcaStr+1;
//reserve memory
char *result =malloc(len);
//concatenate string
memcpy( result,lenStr);
memcpy( result+lenStr,concaStr,lenConcaStr+1);
printf("Hoi");
return result;
}
void concatStrings2( char* newString,char*str){
//calculate suze for memory...
int lenStr=strlen(str);
int lenConcaStr=strlen(newString);
//+1 byte for 0x00
int len=lenStr+lenConcaStr+1;
//reserve memory
printf("\nLen: %d",len);
newString=(char*)realloc(newString,len);
printf(" %s %s ",newString,str);
//concatenate string
memcpy(newString+lenConcaStr,lenStr+1);
printf(" %s %s ",str);
}
void testConcatStrings(char* concaStr,char*expected){
//concatenated string by dynamic memory management(alloc)
char *result = concatStrings(concaStr,str);
concatStrings2(result,str2);
printf("\nstr= %s,concat: %s,str2: %s--> result:%s -->",str2,result);
//check result
(strcmp(result,expected)==0)?printf("Success"): printf("Failure");
//never forget free!!!!
free(result);
printf("\nIs free\n");
}
结果:
Hoi
Len: 24 DynamicMemory Management DynamicMemoryManagement Management
str= Dynamic,concat: Memory,str2: Management--> result:DynamicMemoryManagement -->Success
Is free
Hoi
Len: 25 DynamicMemory Management DynamicMemory Management Management
str= Dynamic,str2: Management--> result:DynamicMemory Management -->Failure
Is free
Hoi
Len: 14 DynamicMemory DynamicMemory
str= Dynamic,str2: --> result:DynamicMemory -->Success
Is free
Hoi
Len: 17 Memory Management MemoryManagement Management
str=,str2: Management--> result:╚d -->Failure
Is free
Hoi
Len: 18 Dynamic Management DynamicManagement Management
str= Dynamic,concat:,str2: Management--> result: -->Failure
Is free
Hoi
Len: 7 Memory Memory
str=,str2: --> result:Memory -->Success
Is free
Hoi
Len: 8 Dynamic Dynamic
str= Dynamic,str2: --> result:Dynamic -->Success
Is free
Hoi
Len: 11 Management Management Management
str=,str2: Management--> result:╚d -->Failure
Is free
Hoi
Len: 1
str=,str2: --> result: -->Success
Is free
(结果看起来很混乱,因为我试图查看函数中到底发生了什么以及错误从哪里开始。)
解决方法
在 concatStrings2
中,变量 newString
是本地的。如果 realloc 改变了堆上的位置,那么新的位置不会传回给被调用者;您需要明确返回新位置。您之所以成功,是因为 realloc 碰巧能够将 char 数组保持在原位(并扩大它)。尝试在 realloc 之前和之后打印 newString
上的地址,您会发现在 realloc 更改位置时您确实遇到了失败。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。