【问题标题】:Why the realloc did not work properly in this case?为什么在这种情况下 realloc 不能正常工作?
【发布时间】:2016-11-06 08:41:23
【问题描述】:
#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”。谁能解释为什么会这样? 我无法识别任何错误。 任何人都可以纠正错误,并帮助我提供有效的代码。请!

【问题讨论】:

  • void main(){..难怪....
  • 您在无法重新分配的 char * 上调用 realloc。所以它失败了,并返回 NULL。
  • @underscore_d 字符串文字的类型为char*
  • 任何人都可以纠正错误,并帮助我提供工作代码。拜托!抱歉,您真的花时间阅读给定的答案吗?我们不是来给你写代码的,我们只能给你指路……

标签: c string pointers realloc


【解决方案1】:

您的程序调用undefined behavior,因为您将一个指针传递给realloc(),该指针以前没有由动态内存分配器系列函数返回。

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

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

也就是说,

【解决方案2】:

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

你可以做的是以下

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

【讨论】:

  • realloc ( NULL, len ); 为什么不只是malloc(len)?它们是等价的,但后者在语义上似乎更好。
  • @underscore_d 因为关于 realloc 的问题。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2017-08-19
    • 1970-01-01
    • 2017-11-26
    • 2010-12-29
    相关资源
    最近更新 更多