2014-08-30 39 views
-3

我在C(malloc)和C++(新)下面的代码。我很困惑为什么C版本不工作。 错误 - 内存分配惨败前块在malloc和新的堆初始化混乱

Exited: ExitFailure 127.

是否有这样做的任何问题。

C++版

#include <iostream> 

using namespace std; 

int main() 
{ 
    char *p=new char[20]; 
    strcpy(p,"Hello"); 
    p=(char*)"Hi"; 
    cout<<p; 
    delete p; 
} 

C版

#include <stdio.h> 
# include <malloc.h> 
# include <string.h> 

int main() 
{ 
    char *p=(char*)malloc(50); 
    strcpy(p,"Hello"); 
    p=(char *)"Hi"; 
    printf("%s",p); 
    free(p); 
} 
+3

两者是不正确的。你必须施加“嗨”的事实应该是线索。 – 2014-08-30 16:47:56

+2

这两个版本都不正确。 'p =(char *)“Hi”;'使'delete'或'free()'的行为未定义。 – 2014-08-30 16:48:34

+2

还要注意,在delete中使用'new []'是未定义的行为,所以即使你修复了指针重新分配,它仍然是错误的代码。 – chris 2014-08-30 16:53:05

回答

1

根据实施细节,mallocnew通常分配更大的存储器段比请求。它们中的每一个在该额外的存储器片段中存储对应的freedelete所需的信息,然后在片段之后向用户返回指向的存储器的指针。

freedelete是所谓的,他们中的每一个预计之前找到所需的信息用户请求解除分配内存的地址。如果该信息被破坏(或者在您的示例中 - 完全无效),则会调用未定义的行为,并且此时可能发生任何事情。

1
char *p=(char*)malloc(50); // you allocate p 
strcpy(p,"Hello");  // you change the p's value in legal way 
         // here should be free(p) 
p=(char *)"Hi";   // YOU OVERWRITE p, YOU CAN'T FREE IT AFTER THAT LINE 
printf("%s",p);  // 
free(p);    // this line should be removed 

另外:

char *p=new char[20]; 
strcpy(p,"Hello"); 
/*here should be delete[] p, not delete p, it deletes only 1 element 
*you allocated 20 
*/ 
p=(char*)"Hi"; 
cout<<p; 
delete p; //this line should be removed 
+0

我认为你是向OP解释他或她已经知道的。这个问题意味着OP知道它是错误的并且不应该工作,但是然后OP询问“C行为”与“C++行为”有什么不同。 – 2014-08-30 19:52:03