【问题标题】:How to properly allocate memory using malloc in C如何在 C 中使用 malloc 正确分配内存
【发布时间】:2015-10-19 18:33:45
【问题描述】:

我有一个 void 指针,我需要正确分配正确类型的内存。说:

char * array="20080101"

现在,我知道这个 char 字符串包含的值是 long 类型。现在,我有一个 void 指针:

void* pointer;

我需要为其分配正确的内存量并将其转换为长指针,以便它指向一个长值(20080101);

问题是我们如何做到这一点?根据我的研究,我知道我可以使用 malloc 将其分配为:

void *pointer=(long*) malloc(sizeof(long) OR sizeof(long)*strlen(array));// what should be the correct parameter.

我们如何让它指向一个 long 类型的值?我们在字符串中有我们的数组。

【问题讨论】:

  • 转换回字符指针并使用atol() 来获取存储在字符串中的long int
  • 我们看到你有点困惑,你可能不知道你真正想要什么。告诉我们您的计划,将指针分配给包含单个值的 long。然后也许我们可以给出更合适的解决方案。或者至少我们可以以更好的方式为您提供建议。
  • “char string contains is a long type”不正确。 array 是指向 char 的指针。
  • “如何在 C 中使用 malloc 正确分配内存”——首先,放弃强制转换。 it only causes harm.

标签: c pointers memory-management malloc


【解决方案1】:

哦,你有点糊涂了。首先,指针,是指针,是指针,而不是长指针和短指针(不再),它们的大小都相同(一般是 8-bytes on x86_644-bytes on x86)。

您的array 指向一个以空字符结尾的字符串文字,其中包含明显的编码日期2008 年1 月1 日。数值20080101 很容易在@987654327 的大小范围内@ 或 unsigned 在任何系统上,并且与为其分配存储无关(除非您在 `16 位系统上)。

如果要将string 转换为long,可以使用strtol,例如:

long myval = strtol (array, NULL, 10);

用于基础10 转换。第二个参数(NULL 上方)实际上是一个endptr,它在成功转换时返回一个指针,指向转换后的数字之后的array 中的下一个字符(如果字符串包含其他字符)。您需要包含<stdlib.h> 才能使用strtol

至于你的演员问题,如果你有array并且它被传递为void,例如

long *somefunction (void *value, long *myval, ...)

在某个函数内部,你需要做两件事来进行转换:

*myval = strtol (value, NULL, 10);

return myval;

或者,如果您只需要从 myval 创建指向 long 的指针,只需创建指针:

long *lpointer = &myval;

为数组分配存储空间

当您为任何字符串动态分配存储空间时,您需要字符串的长度(+ 1 用于空终止符)。在这里您需要了解sizeof 将返回什么以及strlen 将返回什么。如果你取sizeof anypointer,你没有得到长度,你得到的是指针大小(8-bytes等)。当您使用sizeof dereferenced pointer 时,您将获得指向类型的type size(例如sizeof *somelongpointer 将为您提供系统上long 的存储大小)

如果要复制字符串,最好包含<string.h>,然后:

size_t len = strlen (array);

然后你就可以分配存储了:

char *mycopy = malloc (len * sizeof *array + 1);
strncpy (mycopy, array, len * sizeof *array + 1);

mycopy 然后保存array 的内容。由于它是动态分配的,因此您应该在不再需要它时释放它(例如free (mycopy);

如果您的意图是创建一个 指向 long 类型的指针 并为 long 动态分配存储空间,那么您需要 sizeof 来确定系统上 long 的大小。例如

long *mylong = malloc (sizeof *mylong);

然后,(使用相同的somefunction 示例):

*mylong = strtol ((char *)value, NULL, 10);

return mylong;

很抱歉造成混淆,但这应该涵盖所有情况:)

【讨论】:

  • 虽然指针不长也不短,但我认为 OP 在说“长指针”时可能是指“指向长整数的指针”。
  • 非常感谢您的澄清。此外,如果我需要为该字符串分配内存。我应该只使用 sizeof(变量的类型)还是 sizeof(strlen(string)*sizeof(type))。这总是让我感到困惑。什么应该是正确的参数。我的猜测是 sizeof(type)。
  • 经验法则:始终分配要分配的事物的大小。即sizeof(long int),而不是strlen(input)。源数据的大小唯一重要的是您是否尝试为精确副本保留足够的内存。
  • 次要点:“...数值 20080101 在任何系统上都可以轻松地在 intunsigned 的大小范围内”。 2015 年的许多系统使用 16 位 int,这是有效的 C。
  • @AShelly 好吧,现在我们又不清楚了,我们是要复制字符串还是动态分配长指针?我也来补充一下……
【解决方案2】:

如果你真的想分配足够的内存来保存一个长整数,你可以这样做

long* value = malloc(sizeof(*value));

然后像@David所说的那样分配给它:

*value = strtol(array, NULL, 10);

但是,使用局部变量来保存整数通常更简单,而不是从堆中分配它们。

【讨论】:

  • long* value = malloc(sizeof(value));是错的。应该是 sizeof(*value)
  • 哎呀。谢谢你的收获。已编辑。
猜你喜欢
  • 2012-10-10
  • 2018-10-16
  • 1970-01-01
  • 2020-11-01
  • 2020-12-14
  • 1970-01-01
  • 2014-10-23
  • 2019-06-07
  • 1970-01-01
相关资源
最近更新 更多