C语言中的mallocing字符串

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(){

我不太清楚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(){
char*string=(char*)malloc(sizeof(char));
string=“abc”;
int*test=(int*)malloc(1*sizeof(int));
*(测试)=5;
*(测试+1)=6;
}
我希望这会输出一个错误,因为我指定给字符串的值大于一个字符,但它似乎编译得很好

我有几个问题:

  • “字符串”现在保存在哪里?它是在我分配的一个空间之后堆上的内存空间上吗

  • 为什么char让我直接指定,int只通过指针指定

  • 我真的不知道我在这里做什么

    “字符串”现在保存在哪里

    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" );