为啥我不能返回 realloc 的结果? (当你看到代码时你会得到问题......)

Posted

技术标签:

【中文标题】为啥我不能返回 realloc 的结果? (当你看到代码时你会得到问题......)【英文标题】:Why can't I give the results from realloc back? (you get the question when you see the code...)为什么我不能返回 realloc 的结果? (当你看到代码时你会得到问题......) 【发布时间】:2021-04-17 16:54:11 【问题描述】:

任务是制作 2 个不同的功能。 1 其中 malloc 为 char 创建一个长度并放入它们的 2 个字符串。另一个函数不能给出返回类型。它应该改变 2 个融合字符串的长度以适应第三个。但在某些情况下,它并没有给出应有的结果。第一个“失败”应该是一个,但其他 3 个一次不应该是一个......

#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 ", str,"Management","DynamicMemoryManagement");
    testConcatStrings("Memory", str,"","DynamicMemory");
    testConcatStrings("Memory","" ,"Management","MemoryManagement");
    testConcatStrings("", str,"Management","DynamicManagement");
    testConcatStrings("Memory", "","","Memory");
    testConcatStrings("", str,"",str);
    testConcatStrings("", "","Management","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,str,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,str,lenStr+1);
    printf(" %s %s ",newString,str);


void testConcatStrings(char* concaStr,char*str, char*str2, 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 -->", str,concaStr,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, concat: Memory , str2: Management--> result:DynamicMemory Management -->Failure
Is free
Hoi
Len: 14 DynamicMemory   DynamicMemory
str= Dynamic, concat: Memory, str2: --> result:DynamicMemory -->Success
Is free
Hoi
Len: 17 Memory Management  MemoryManagement Management
str= , concat: Memory, 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= , concat: Memory, str2: --> result:Memory -->Success
Is free
Hoi
Len: 8 Dynamic   Dynamic
str= Dynamic, concat: , str2: --> result:Dynamic -->Success
Is free
Hoi
Len: 11  Management  Management Management
str= , concat: , str2: Management--> result:╚d -->Failure
Is free
Hoi
Len: 1
str= , concat: , str2: --> result: -->Success
Is free

(结果看起来很混乱,因为我试图确切地查看函数中发生了什么以及错误从哪里开始。)

【问题讨论】:

大部分由Proper usage of realloc() 回答,尽管concatStrings2 没有将其第一个参数作为双指针接收(防止它在reallocs 时更改调用者分配的指针) 是一个额外的问题。 【参考方案1】:

concatStrings2 中,变量newString 是本地的。如果 realloc 改变了堆上的位置,那么新的位置不会传回给被调用者;您需要明确返回新位置。您之所以成功,是因为 realloc 碰巧能够将 char 数组保持在原位(并放大它)。尝试在 realloc 之前和之后打印newString 上的地址,您会发现当 realloc 更改位置时会出现故障。

【讨论】:

以上是关于为啥我不能返回 realloc 的结果? (当你看到代码时你会得到问题......)的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 realloc() 时会出现双重释放或损坏错误?

在 C++ 中使用 realloc

为啥我不能返回这个向量向量?

为啥在使用 realloc() 进行动态内存分配之后再添加一块内存?

如果失败,realloc 会释放前一个缓冲区吗?

realloc() 失败并返回 NULL 时的正确用法是啥?