如何修复 realloc expected declaration specifiers or ‘...’ before ‘sizeof’ 错误?

How to fix realloc expected declaration specifiers or ‘...’ before ‘sizeof’ error?

调用 realloc

后出现以下错误
void* realloc(sizeof(char)100);

错误:

linex.c:23:16: error: expected declaration specifiers or ‘...’ before ‘sizeof’

请帮忙。谢谢你。 :)

void realloc(sizeof(char)100);

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

1.

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

这是标准 realloc() 函数的 prototype/declaration:

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

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

2.

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

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

请注意,在这两种情况下,转换都是多余的。查看return类型的转换,看看:

  • Do I cast the result of malloc?

3.

在大小参数处,您需要 sizeof(char)100 之间的 * 运算符。


使用:

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

请注意,您还应始终检查 memory-management 函数的 return 值是否发生错误:

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() 的 return 值。

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

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

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

相关:

void* realloc(sizeof(char)*100); 是声明和调用函数的大杂烩。

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

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

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

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