C语言中的mallocing字符串
我不太清楚malloc的工作原理C语言中的mallocing字符串,c,char,malloc,heap,C,Char,Malloc,Heap,我不太清楚malloc的工作原理 #include <stdio.h> #include <stdlib.h> int main() { char * string = (char*) malloc(sizeof(char)); string = "abc"; int * test = (int*) malloc(1 * sizeof(int)); *(test) = 5; *(test + 1) = 6; } #包括 #包括 int main(){
#include <stdio.h>
#include <stdlib.h>
int main() {
char * string = (char*) malloc(sizeof(char));
string = "abc";
int * test = (int*) malloc(1 * sizeof(int));
*(test) = 5;
*(test + 1) = 6;
}
#包括
#包括
int main(){
char*string=(char*)malloc(sizeof(char));
string=“abc”;
int*test=(int*)malloc(1*sizeof(int));
*(测试)=5;
*(测试+1)=6;
}
我希望这会输出一个错误,因为我指定给字符串的值大于一个字符,但它似乎编译得很好
我有几个问题:
string
现在指向“abc”(一个文本字符串)-初始动态分配(在堆中)已丢失,并且内存泄漏。此代码
string = "abc";
将字符串常量
“abc”
的地址分配给字符串
变量,该变量是字符*
。从malloc()
调用返回的内存地址(位于字符串中)被覆盖并丢失。除了其他答案外:
你可能想要这个:
char *string = (char*) malloc(sizeof(char) * 100); // allocate space for 100 chars
strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string
与此相反:
char *string = (char*) malloc(sizeof(char)); // << this allocates only a single char
string = "abc";
最好写为:
test[0] = 5;
test[1] = 6;
这是严格等价的,只是可读性的问题
分配的内存太少:
如果仅为1个字符分配内存,如下所示:
char *string = (char*) malloc(sizeof(char)); // allocate space 1 char
strcpy(string, "abc"); // copy the "abc" into the memoory location pointer by string
然后,您的程序仍然可以正常编译,但在运行时,字符串将部分复制到未分配的内存中,这将导致未定义的行为(google“undefined Behavior”)。我将给您一个真实的示例
假设A先生住在“abc”地址。现在,一些B先生开始住在某个地址“xyz”。很快,B先生的地址“xyz”被重命名为“abc”。现在,如果你去地址“abc”,你会遇到B先生,而不是A先生。但是,这并不意味着A先生的地方被拆除了。这仅仅意味着A先生的居住区现在没有可联系的地址,并且丢失了
类似地,您将malloc
分配给string
的内存,然后将string
重新分配给“abc”,这意味着前面的string
有一个到malloc
的内存地址。稍后,您的“abc”被写入某个内存,该内存的地址存储在字符串中。因此,永久丢失malloc
'ed内存,这被称为内存泄漏。编译器不会阻止您执行允许的操作-但是您可能会收到1)的警告,因为字符串在重新分配之前已分配且未使用(前提是要求编译器输出相关警告)
对于2),您调用的函数恰好是malloc
,其参数对于malloc
返回的指针的用法来说恰好太小,但由于语法正确,编译器不会抱怨
答复
1) string
指向“abc”
,并且malloc
中的上一个值丢失
2) 你可以做test[0]=5代码>也是
2)的行为是未定义的行为(访问数组超出范围)。起初,动态分配了内存,请求的大小为一个字符
char * string = (char*) malloc(sizeof(char));
然后用字符串文字“abc”的第一个字符的地址重新分配指针
因此,动态分配内存的地址丢失,并且程序中存在内存泄漏
如果程序是用C++编写的,那么这个语句
string = "abc";
string = "abc";
会产生编译器诊断消息,因为C++中的字符串字有常数字符数组的类型,指针<代码>字符串< /代码>声明为
const char *string;
至于字符串文字,则它们具有静态存储持续时间,并在main获得控件之前进行分配。通常,所有字符串文字都位于所谓的字符串文字池中
而不是这句话
string = "abc";
string = "abc";
你可以写
strcpy( string, "abc" );
在这种情况下,程序具有未定义的行为。但是,由于函数malloc
通常分配的最小内存范围等于等于16字节的段落值,因此它可以继续成功工作 为什么是你?@PaulMcKenzie我正在学习麻省理工开放式课程,ppt示例使用了这一点,但你的权利似乎很愚蠢,谢谢你提供的额外信息*(test+1)=6代码>越界写入您正在写入的是未定义的行为。老实说,如果您不知道如何正确地将字符串分配给字符指针,那么您实际上还没有准备好使用malloc
@DavidHoelzer没有人准备好使用malloc
,老实说,我只为一个字符分配了空间,那么当我为另一个变量分配空间时,保存“bc\0”的地址会被覆盖吗?编辑:是的,在我的评论结束之前你就回答了。感谢数字是非常糟糕的做法。用坏习惯开始新的程序员是个坏主意。@DavidHoelzer你是对的,但我不想让事情过于复杂,OP的程序只是一个测试程序。这是一个C问题。C++代码的行为irrelevant@M.M没有任何“无关”信息。在C 1中,指针也可以用QualimeCor const声明,C中的C++可以使用与C++相同的方法;2)C和C++中的相同构造的比较非常有用,有助于更好地理解C和C++。
strcpy( string, "abc" );