#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;。任何人都可以解释为什么会如此? 我无法识别任何错误。 任何人都可以纠正错误,并帮助我使用正常工作的代码。请!
答案 0 :(得分:6)
您的程序调用{{3}},因为您将指针(以前未由动态内存分配器函数系列返回)传递给realloc()
。
根据C11
,章节§7.22.3.5, realloc函数,(强调我的)
如果
ptr
是空指针,则realloc
函数的行为类似于malloc
函数 指定大小。否则,如果ptr
与先前由内存返回的指针不匹配 管理功能,或者如果通过调用free
或已释放空间realloc
函数,行为未定义。 [...]
那就是说,
对于托管环境,void main()
最好至少为int main(void)
。
答案 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 )