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

标签 c arrays memory-management

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

char *str;


str = (int*)malloc(10 * sizeof(int)); 

任务是为包含 10 个元素的字符串分配内存。

我是否正确地完成了它,或者我是否必须添加“+ 1”因为末尾有“\0”。

谢谢!

最佳答案

您分配的数额超出您的需要数倍。 (准确地说是 sizeof(int) 次)。正确的应该是

#define MAXLEN 10
...
str = malloc(sizeof *str*(MAXLEN+1));

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

str = malloc(MAXLEN+1);

检查 malloc 的返回值,如下所示:(malloc 可能无法为请求提供服务,它可能返回空指针。重要的是 检查这个以防止以后尝试取消引用空指针)。

str = malloc(MAXLEN+1);
if(!str){
    perror("malloc");
    exit(EXIT_FAILURE);
}

此外,void*char* 的转换是隐式的 - 您不需要转换 malloc 的返回值。

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

关于c - 具有给定元素数量的动态创建的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48528077/

相关文章:

Python CFFI - 无法在函数调用中使用格式化的 Python 字符串作为字节数组

Java 菜鸟,codewars 类(class) #1 - 数组的最小值

php - 如何在 NodeJS 的请求中对表单字段中的数组进行编码?

c++ - 我们可以通过 IPC 传递具有动态管理成员的类的对象吗?

c - 如何准确读取管道中的消息长度?

无法使用 gcc 编译 ANSI C 代码

c - 函数返回零

python - 形状为 (N,1) 的数组与形状为 (N) 的数组有什么区别?以及两者之间如何转换?

java - 最大化 Java 堆空间

c - 将内存公开为只读