为什么 realloc 在这种情况下不能正常工作?

Why the realloc did not work properly in this case?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *func(char * str){


    int len;
    len=strlen(str)+3;
    str = (char *)realloc(str,len);
    return str;


}

void main(){

    printf("str:%s",func("hello"));

}

最后的 ans 打印 (null),而不是打印字符串:"hello"。谁能解释为什么会这样? 我无法识别任何错误。 任何人都可以纠正错误,并帮助我提供工作代码。请!

您可以重新分配动态分配的对象。字符串文字具有静态存储持续时间,不能更改。任何修改字符串文字的尝试都会导致未定义的行为。

你可以做的是以下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *func( const char * str )
{
    size_t len = strlen( str ) + 3;

    char *tmp = realloc( NULL, len );

    if ( tmp ) strcpy( tmp, str );

    return tmp;
}

int main( void )
{
    char *str = func( "hello" );

    if ( str ) printf( "str: %s\n", str );

    free( str );
}

程序输出为

str: hello

考虑到调用

realloc( NULL, len )

等同于

malloc( len )

您的程序调用 undefined behavior 是因为您将一个指针传递给 realloc().

,该指针之前未由动态内存分配器系列函数返回

根据C11,章节 §7.22.3.5,realloc 函数,(强调我的

If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined. [...]

也就是说,

  • 对于托管环境,至少 void main() 最好是 int main(void)

  • Please see this discussion on why not to cast the return value of malloc() and family in C..

"hello" 是一个 只读 字符串 文字 。它的类型实际上是 const char* 尽管编译器允许分配给 char* 尽管这会导致所有快乐的地狱。

在此类指针上调用 realloc 的行为是 未定义。所以编译器可以做任何它喜欢的事情。它可能会吃掉你的猫。