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

时间:2016-07-04 15:03:42

标签: c string pointers realloc

#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),而不是打印字符串:&#34; hello&#34;。任何人都可以解释为什么会如此? 我无法识别任何错误。 任何人都可以纠正错误,并帮助我使用正常工作的代码。请!

3 个答案:

答案 0 :(得分:6)

您的程序调用{​​{3}},因为您将指针(以前未由动态内存分配器函数系列返回)传递给realloc()

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

  

如果ptr是空指针,则realloc函数的行为类似于malloc函数   指定大小。否则,如果ptr与先前由内存返回的指针不匹配   管理功能,或者如果通过调用free或已释放空间   realloc函数,行为未定义。 [...]

那就是说,

答案 1 :(得分:6)

"hello"只读字符串文字。它的类型实际上是const char*,尽管编译器允许赋值给char*,尽管这会引起它的所有快乐地狱。

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

答案 2 :(得分:1)

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

您可以做的是以下

#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 )