【问题标题】:Dynamically created array with given number of elements具有给定元素数量的动态创建的数组
【发布时间】:2018-01-30 18:21:48
【问题描述】:

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

char *str;


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

任务是分配具有 10 个元素的字符串内存。

我做对了吗,还是因为末尾有“\0”而必须添加“+ 1”。

谢谢!

【问题讨论】:

  • char *str,为什么在哪里?!
  • 您分配了太多内存,str 是 char 指针而不是 int 指针。所以你只需要分配 11 个字节。可以像这样str = malloc(11);
  • 你的“元素”是什么?字符还是整数?下定决心。
  • \0 终止符仅适用于字符串。如果需要 10 个字符的字符串,则需要 11 个字节。你的问题中没有提到“字符串”或“字符串”,所以不清楚你想要什么。

标签: c arrays memory-management


【解决方案1】:

您分配的资金比您需要的多很多倍。 (准确地说是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-s 的已分配内存时,您无需查找sizeof(char) 然后将其替换为sizeof(int) 就完成了这里自动使用sizeof(*str)

【讨论】:

  • 但是为什么你用 sizeof(*str) 而不是 sizeof(char) 呢?
  • @Desibre93.:阅读答案的最后一部分。
  • 非常感谢,但我也可以像这样简单地写它 str = malloc(11) 吗?
  • 永远不要写malloc(11)。当您稍后阅读代码时 - 11 是什么? (为什么不是 12 或 42?)
  • @Desibre93 基本编程技术:对缓冲区大小、字符串长度等内容使用常量定义。不要在代码中硬编码它们。例如,如果您只使用 11,那么当您编写一个循环时,比如说,要通过您的缓冲区,您也需要一个 10 或 11。然后,当您需要更改代码以处理不同的号码时,您必须找到所有有该号码的地方。所以使用#define MAXLEN 10 作为字符数,使用MAXLEN+1 作为所需缓冲区的大小。那么如果它必须改变,你只需要改变#define MAXLEN 10中的值。
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2020-07-21
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多