【问题标题】:How to fix realloc expected declaration specifiers or ‘...’ before ‘sizeof’ error?如何在“sizeof”错误之前修复 realloc 预期声明说明符或“...”?
【发布时间】:2020-12-05 00:17:36
【问题描述】:

调用realloc后出现以下错误

void* realloc(sizeof(char)100);

错误:

linex.c:23:16: 错误:预期的声明说明符或“...”之前 '大小'

请帮忙。谢谢你。 :)

【问题讨论】:

  • 相应的代码在哪里?
  • @Hashbro54 最后阅读函数 realloc 的描述。有时它很有用。

标签: c memory-management realloc


【解决方案1】:
void realloc(sizeof(char)100);

假设您的意思是调用标准 realloc() 函数(而不是自定义 realloc() 的声明)并且您想要调整内存大小,那么这段代码在三点上是错误的。

1.

realloc() 需要一个指向由内存管理分配的内存并且尚未作为第一个参数释放的内存的指针。

这是标准realloc() 函数的原型/声明:

void *realloc( void *ptr, size_t new_size );

您的realloc() 调用省略了这个指针参数。

2.

当你想调用一个函数时,不要指定返回类型(这里是void *)。这样,您就可以尝试对函数 realloc() 进行新声明,而不是调用。

如果你试图在这里做一些投射,这也是错误的。对于隐式转换,您需要用括号将要转换的类型括起来,例如 (void *)

请注意,在这两种情况下,演员表都是多余的。通过查看返回类型的转换,请查看:

3.

在 size 参数中,您需要在 sizeof(char)100 之间使用 * 运算符。


用途:

realloc( ptr, sizeof(char) * 100 );

请注意,您还应该始终检查内存管理函数的返回值是否发生错误:

char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
    fputs("Error at resizing the allocated memory!\n", stderr);
    // error routine.
}

总是应该为malloc()做同样的事情:

char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
    fputs("Error at memory allocation!\n", stderr);
    // error routine.
}

进阶课(此时不需要理解):

请注意,在realloc() 的情况下,我使用不同的指针来捕获realloc() 的返回值。

这是因为realloc() 可能会或可能不会返回作为参数传递的相同指针。

一个不幸的常见但不好的做法是通过realloc()的返回值重新分配作为第一个参数传递的指针。

这是危险的,因为如果realloc() 分配了另一个“替换”内存但没有先擦除,那么对首先分配的内存的引用可能会丢失。

相关:

【讨论】:

  • 您好,那么这条线有意义吗? void *realloc(void *dynamic, sizeof(char)*100);谢谢。
  • @Hashbro54 当你想调用realloc()时,你需要同时省略void *s。这不是realloc() 的声明,也不是某种类型转换。
  • 对,所以我省略了 void *,现在我有了这个代码 realloc(dynamic, sizeof(char) *100);但是,我得到这个错误:linex.c:28:9: 警告:忽略'realloc'的返回值,用属性warn_unused_result声明[-Wunused-result]你能帮忙吗,对不起
  • @Hashbro54 可以设计一个编译器来警告它想要的任何东西。您的编译器似乎很专心。我在答案中添加了一些内容。这就是编译器给你这个警告的原因。你总是应该检查内存管理函数的返回值。
【解决方案2】:

void* realloc(sizeof(char)*100); 是声明和调用函数的混搭。

当我们声明一个函数时,我们会说它的返回类型是什么以及它的参数是什么类型,如void *realloc(void *, size_t);。我们还可以为参数提供占位符名称作为有用的描述,如void *realloc(void *pointer, size_t size);。 (完整定义函数时需要参数名称。)

当我们调用函数时,我们不会为返回值或参数指定类型名称。我们只给出提供参数值的表达式,如NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);

有时类型名称可能会出现在函数调用中或附近,但这些名称是偶然的,并不是函数调用的直接部分。例如:

  • char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);:这段代码有char *,因为它声明并定义了NewPointer。然后使用realloc 调用初始化NewPointer
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);:此代码具有(char *) 作为转换将realloc 的返回值转换为特定指针类型。这在 C 中是不需要的。
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));:此代码将char * 作为sizeof 的操作数来计算所需的空间。这是不必要的,因为可以使用sizeof *NewPointer 获取大小,并且通常更可取,因为它会自动调整NewPointer 声明中的更改,从而减少通过更改声明中的类型可能引入错误的可能性NewPointer 但忽略了 sizeof 表达式。

【讨论】:

  • 有一个编辑影响了另一个问题。提供的原始代码 void realloc(sizeof(char)100); 不是 void realloc(sizeof(char)*100);。我恢复了这个问题的变化。也许您考虑将其纳入其中?我也已经介绍过了,所以你不需要。只是作为一个提示。
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2023-01-19
  • 1970-01-01
  • 2011-09-04
  • 2014-06-08
  • 1970-01-01
相关资源
最近更新 更多