动态创建具有给定数量元素的数组

Des*_*e93 2 c arrays memory-management

我不是100%确定我是否正确分配了一个包含10个元素的数组

char *str;


str = (int*)malloc(10 * sizeof(int)); 
Run Code Online (Sandbox Code Playgroud)

任务是分配10个元素的字符串内存.

我是否正确完成了,或者我必须添加"+ 1",因为最后的"\ 0".

谢谢!

use*_*738 6

您分配的次数超过了您的需要.(sizeof(int)时间要准确).正确的是

#define MAXLEN 10
...
str = malloc(sizeof *str*(MAXLEN+1));
Run Code Online (Sandbox Code Playgroud)

请注意,这将sizeof(char)1.所以你也可以这样做

str = malloc(MAXLEN+1);
Run Code Online (Sandbox Code Playgroud)

检查返回值,malloc如下所示:( malloc可能无法为请求提供服务,它可能会返回一个空指针.检查此项以防止以后尝试取消引用空指针非常重要).

str = malloc(MAXLEN+1);
if(!str){
    perror("malloc");
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)

此外void*,以char*转换是隐式的-你不需要投的返回值malloc.

sizeof(*str)是一种更简洁的方法来获取我们为其分配内存的元素类型的大小str.好处是,当您稍后更改代码并str指向一个已分配的内存时,该内存将包含int您不需要查找的-s sizeof(char),然后sizeof(int)通过sizeof(*str)自动使用来替换它.

  • 永远不要写`malloc(11)`.当你稍后阅读代码时 - 11什么?(为什么不是12或42?) (2认同)
  • @Desibre93基本编程技术:对缓冲区大小,字符串长度等事物使用常量定义.不要在代码中对它们进行硬编码.例如,如果您刚刚使用了11,那么当您编写一个循环,比如说,通过缓冲区时,您还需要10或11.然后,当您需要更改代码以处理不同的数字时,您必须找到具有该数字的所有地方.因此,使用`#define MAXLEN 10`表示字符数,使用`MAXLEN + 1`表示所需缓冲区的大小.然后如果必须改变,你只需要改变`#define MAXLEN 10`中的值. (2认同)