如何修复 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
表达式。
调用 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
表达式。