2016-07-04 108 views
0
#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”。任何人都可以请解释为什么是这样吗? 我无法识别任何错误。 任何人都可以纠正错误,并帮助我一个工作代码。请!为什么realloc在这种情况下无法正常工作?

+1

'无效的主要(){..怪不得.... –

+3

你叫realloc的上一个char *不能realloced。所以它失败了,并返回NULL。 –

+0

问题是标签'动态allocation',并且尚未看到有没有...... @WilliamPursell不应该产生这样的警告,或者完全无法编译,用于传递'字符常量*'(字符串类型的文字)到'func()'?我主要是编程C++ 14的所有警告,所以也许我太习惯于良好的类型安全... –

回答

6

您的程序调用undefined behavior是因为您将指针传递给realloc(),此指针先前未由动态内存分配器函数系列返回。

C11,章§7.22.3.5,的realloc函数,(重点煤矿

如果ptr是一个空指针,则realloc函数的行为像malloc功能的 指定大小。否则,如果ptr不匹配的内存 管理功能早些时候返回一个指针,或者如果空间已释放被调用freerealloc功能,的行为是不确定的。 [...]

这就是说,

+1

@匿名[首选方式在stackoverflow说“谢谢”](http://meta.stackexchange.com/a/5235/202811) –

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) 
+0

'的realloc(NULL,LEN);'为什么不'的malloc(LEN)'?它们是相同的,但后者在语义上似乎更好。 –

+0

@underscore_d因为关于realloc的问题。 –

6

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

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

相关问题