为什么使用malloc?

这个问题在这里已经有了答案:

  • 声明字符串和分配字符串3个答案之间的区别

  • char *strarray[5];
    

    将分配五个指针数组(可以解释为字符串)。

    不会分配的是放置这五个字符串的内存空间。 所以,如果你想让所有的指针指向不同的字符串,你需要自己分配它们。

    但是,由于这些是指针,如果你不想分配的话,你并不需要分配任何东西。 这就是为什么你的第一个例子正在工作。 strarray[0]="hello"; 将使数组的第一个元素指向存储"hello"字符串文字的位置(编译器会将此文字放在内存中的某处,以便您的指针指向有效的内存位置)。

    总结一下,在第一个例子中,你的指针指向已经分配的内存,并用"hello"初始化(编译器为你做了这个) - 你没有复制字符串,只是给指针赋值。 在第二个例子中,你的指针指向一个未定义的位置,而你没有明确保留,但是你正试图写入它。


    这是错误的: char *strarray[5]; 这是堆栈分配5个char *指针。 我想你想编写char strarray[6] ,它会在堆栈中创建6个字符。 这可以容纳“hello”和它的隐式NULL终结符(NULL终止符告诉C函数一个字符串已经结束)。

    写了char strarray[6];strcpy(strarray, "hello"); 是安全的。 然后你可以打电话给:

    printf("%sn",strarray);
    

    我已经删除了[0]: %s期望char*不是charstrarray[0]是一个char类型。

    您可以使用malloc在堆上分配内存。 我可能会建议你阅读Kernighan和Ritchie(C编程语言)了解更多细节。


    malloc() :分配一个大小为字节的内存块,返回一个指向块开始的指针。

    void* malloc (size_t size);  
    

    size_t是一个unsigned int类型。

    如果你不知道要创建多少内存,这是必要的,这是不正确的。
    你应该知道需要多少最小内存。

    在malloc()的帮助下,您可以在run time分配内存,而不是在compile time.

    strarray[0]="hello";   
    //here you need not to allocate memory as this is an assignment 
    

    在使用指针作为strcpy() destination string之前,您需要分配一些空间

    strcpy()将source指向的C字符串复制到目标所指向的数组中,包括终止空字符(并在该点停止)。

    目的地指向的数组的大小应足够长以包含与源(包括终止空字符)相同的C字符串,并且不应与内存中的源重叠。

    为此,您需要先allocate Memory first

    strcpy本身不会为目标字符串分配内存

    链接地址: http://www.djcxy.com/p/60877.html

    上一篇: Why exactly malloc is used?

    下一篇: UI Terminology: Logon vs Login