Làm cách nào để sửa lỗi khai báo dự kiến realloc hoặc '…' trước lỗi 'sizeof'?
Tôi gặp lỗi sau sau khi gọi realloc
void* realloc(sizeof(char)100);
Lỗi:
linex.c: 23: 16: error: dự kiến chỉ định khai báo hoặc '...' trước 'sizeof'
Hãy giúp tôi. Cảm ơn bạn. :)
Trả lời
void realloc(sizeof(char)100);
Giả sử ý của bạn là một lệnh gọi đến realloc()
hàm tiêu chuẩn (không phải là một khai báo về một tùy chỉnh realloc()
) và bạn muốn thay đổi kích thước bộ nhớ, thì mã này sai về ba điểm.
1.
realloc()
cần một con trỏ tới bộ nhớ được cấp phát bởi bộ quản lý bộ nhớ và chưa được giải phóng như đối số đầu tiên.
Đây là nguyên mẫu / khai báo cho realloc()
hàm tiêu chuẩn :
void *realloc( void *ptr, size_t new_size );
Cuộc realloc()
gọi của bạn bỏ qua đối số con trỏ này.
2.
Không chỉ định kiểu trả về (ở đây void *
) khi bạn muốn gọi một hàm. Với điều này, bạn cố gắng thực hiện một khai báo mới của hàm realloc()
chứ không phải một cuộc gọi.
Nếu bạn đã cố gắng thực hiện một số truyền ở đây, điều này cũng sai. Đối với kiểu ép kiểu ngầm, bạn cần phải bao quanh kiểu được truyền vào trong các dấu ngoặc đơn như (void *)
.
Lưu ý rằng trong cả hai trường hợp diễn viên đều dư thừa. Với chế độ xem kiểu trả về, hãy xem:
- Tôi có bỏ kết quả của malloc không?
3.
Tại đối số kích thước, bạn cần *
toán tử giữa sizeof(char)
và 100
.
Sử dụng:
realloc( ptr, sizeof(char) * 100 );
Lưu ý rằng bạn cũng phải luôn kiểm tra giá trị trả về của các hàm quản lý bộ nhớ xem có xảy ra lỗi hay không:
char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
fputs("Error at resizing the allocated memory!\n", stderr);
// error routine.
}
Điều tương tự bạn luôn nên làm đối với malloc()
:
char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
fputs("Error at memory allocation!\n", stderr);
// error routine.
}
Bài học nâng cao (Bạn không cần phải hiểu nó vào lúc này):
Lưu ý rằng trong trường hợp của realloc()
, tôi sử dụng một con trỏ khác để bắt giá trị trả về của realloc()
.
Điều này là do realloc()
có thể có hoặc không trả về cùng một con trỏ được truyền làm đối số.
Một thực tế không may phổ biến nhưng không tốt là gán lại con trỏ được truyền làm đối số đầu tiên bằng giá trị trả về realloc()
.
Điều này rất nguy hiểm vì tham chiếu đến bộ nhớ được cấp phát trước sau đó có thể bị mất nếu realloc()
được cấp phát một bộ nhớ "thay thế" khác nhưng không xóa bộ nhớ đầu tiên.
Có liên quan:
- Việc gán địa chỉ do realloc () trả về cho cùng một con trỏ có tốt không?
- https://stackoverflow.com/a/25435175/12139179
- Làm thế nào để realloc () phân bổ lại bộ nhớ?
void* realloc(sizeof(char)*100);
là một hỗn hợp của việc khai báo một hàm và gọi nó.
Khi chúng ta khai báo một hàm, chúng ta nói kiểu trả về của nó là gì và các tham số của nó là kiểu gì, như trong void *realloc(void *, size_t);
. Chúng tôi cũng có thể cung cấp tên trình giữ chỗ cho các thông số dưới dạng mô tả hữu ích, như trong void *realloc(void *pointer, size_t size);
. (Tên tham số là bắt buộc khi xác định đầy đủ chức năng.)
Khi chúng ta gọi một hàm, chúng ta không cung cấp tên kiểu cho giá trị trả về hoặc các tham số. Chúng tôi chỉ đưa ra các biểu thức cung cấp các giá trị đối số, như trong NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
.
Đôi khi tên kiểu có thể xuất hiện trong hoặc gần một lệnh gọi hàm, nhưng đây là sự cố ngẫu nhiên và không trực tiếp là một phần của lệnh gọi hàm. Ví dụ như:
char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
: Mã này cóchar *
vì nó khai báo và định nghĩaNewPointer
. Sau đóNewPointer
được khởi tạo vớirealloc
cuộc gọi.NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);
: Mã này có(char *)
vai trò như một phép ép kiểu để chuyển đổi giá trị trả về củarealloc
một loại con trỏ cụ thể. Điều này không cần thiết trong C.NewPointer = realloc(OldPointer, 100 * sizeof(char));
: Mã này cóchar *
như một toán hạngsizeof
để tính toán không gian cần thiết. Điều này là không cần thiết vì kích thước có thể được sử dụngsizeof *NewPointer
, và điều đó nói chung là thích hợp hơn vì nó tự động điều chỉnh theo các thay đổi trong khai báoNewPointer
, giảm khả năng lỗi có thể được đưa ra bằng cách thay đổi kiểu trong khai báoNewPointer
nhưng bỏ quasizeof
biểu thức.