为什么 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
的行为是 未定义。所以编译器可以做任何它喜欢的事情。它可能会吃掉你的猫。
#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, therealloc
function behaves like themalloc
function for the specified size. Otherwise, ifptr
does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to thefree
orrealloc
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 inC
..
"hello"
是一个 只读 字符串 文字 。它的类型实际上是 const char*
尽管编译器允许分配给 char*
尽管这会导致所有快乐的地狱。
在此类指针上调用 realloc
的行为是 未定义。所以编译器可以做任何它喜欢的事情。它可能会吃掉你的猫。