Bây giờ trước khi mọi người bắt đầu đánh dấu điều này là trùng lặp, tôi đã đọc tất cả những điều sau đây, không có câu nào cung cấp câu trả lời mà tôi đang tìm kiếm:
- C Câu hỏi thường gặp: Có gì sai với việc truyền giá trị trả về của malloc?
- VẬY: Tôi có nên ép kiểu rõ ràng giá trị trả về của malloc () không?
- VẬY: Phôi con trỏ không cần thiết trong C
- VẬY: Tôi có bỏ kết quả của malloc không?
Cả C FAQ và nhiều câu trả lời cho các câu hỏi trên đều trích dẫn một lỗi bí ẩn mà malloc
giá trị trả về của ép kiểu có thể ẩn; tuy nhiên, không ai trong số họ đưa ra một ví dụ cụ thể về một lỗi như vậy trong thực tế. Bây giờ hãy chú ý rằng tôi đã nói lỗi , không phải cảnh báo .
Bây giờ được cung cấp mã sau:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Việc biên dịch đoạn mã trên với gcc 4.2, có và không có ép kiểu đưa ra các cảnh báo giống nhau và chương trình thực thi đúng cách và cung cấp kết quả giống nhau trong cả hai trường hợp.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
Vì vậy, bất cứ ai có thể cung cấp một ví dụ mã cụ thể về lỗi biên dịch hoặc thời gian chạy có thể xảy ra do malloc
giá trị trả về của ép kiểu, hay đây chỉ là một huyền thoại đô thị?
Chỉnh sửa Tôi đã bắt gặp hai lập luận bằng văn bản liên quan đến vấn đề này:
- Trong Ưu đãi Truyền: Tư vấn CERT: Truyền ngay kết quả của một lệnh gọi hàm cấp phát bộ nhớ thành một con trỏ đến kiểu được cấp phát
- Chống truyền (lỗi 404 kể từ 2012-02-14: sử dụng bản sao Máy lưu trữ Internet từ 2010-01-27. {2016-03-18: "Không thể thu thập dữ liệu hoặc hiển thị trang do robots.txt."})
void
con trỏ cho phép để biên dịch mã như C ++; một số người nói rằng đó là một tính năng, tôi muốn nói đó là một lỗi;)