Tôi đã luôn luôn được lập trình trong Java, mà có lẽ là lý do tại sao tôi rất bối rối về điều này:Tôi rất bối rối về malloc() và calloc() trên C
Trong Java Tôi tuyên bố một con trỏ:
int[] array
và khởi tạo hoặc chỉ định một số bộ nhớ:
int[] array = {0,1,0}
int[] array = new int[3]
Bây giờ, trong C, đó là tất cả rất khó hiểu. Lúc đầu, tôi nghĩ rằng nó là dễ dàng như việc tuyên bố nó:
int array[]
và khởi tạo nó hay gán cho nó một số bộ nhớ:
int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))
Trừ khi tôi là sai, tất cả những điều trên là tương đương Java-C , đúng?
Sau đó, hôm nay tôi gặp một mã trong đó tôi thấy như sau:
pthread_t tid[MAX_OPS];
và một số dòng dưới đây, mà không cần bất kỳ loại khởi ...
pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);
Đáng ngạc nhiên (ít nhất là tới tôi), mã hoạt động! Ít nhất trong Java, điều đó sẽ trả về một "NullPointerException" tốt đẹp!
Vì vậy, theo thứ tự:
Am I correct với tất cả các "bản dịch" Java-C?
Tại sao mã đó hoạt động?
Có sự khác biệt nào giữa việc sử dụng
malloc(n*sizeof(int))
vàcalloc(n,sizeof(int))
không?
Cảm ơn trước
Đoạn 1 có một số xác nhận không rõ ràng nguy hiểm. OP không cố gán bộ nhớ cho một mảng, anh ta đang cố gán một (void *), trả về từ malloc() cho một mảng, và nếu mảng đó là int * Array [i], có lẽ trong một cho vòng lặp {}, nó sẽ hoạt động tốt và là cơ sở cho các mảng đa chiều động, được cấp phát ra khỏi vùng heap như thế nào. Ngoài ra, C99 hỗ trợ các mảng có kích thước biến được cấp phát khỏi ngăn xếp, một vài tính năng C lập trình viên sử dụng, hầu hết thích alloca(), bao gồm cả tôi. http://stackoverflow.com/q/1018853/2548100 – user2548100
calloc() là khá nhiều chỉ là memset (malloc (n * mysize), 0, (n * mysize)). Đặc biệt là vì C sử dụng các chuỗi được kết thúc bằng null, calloc() rất hữu ích, đặc biệt khi xem các chuỗi trong một trình gỡ lỗi, thường chỉ hiển thị chuỗi chỉ tới trình kết thúc null. Nếu bạn chỉ cần nói ra với C, hãy sử dụng calloc thay vì malloc, nó sẽ giúp bạn tiết kiệm được rất nhiều lỗi chuỗi C không kết thúc mà có thể và có thể sẽ làm hỏng chương trình của bạn. Đối với mã sản xuất/phát hành, chỉ sử dụng calloc() khi bạn thực sự cần khởi tạo bộ đệm/mảng/vectơ tới (_int8) 0. – user2548100
Chỉ để bọc mọi thứ lên, và để hoàn thành, một mảng là một con trỏ. Trong thực tế, bất kỳ tên mảng nào trong C là chính xác, chính xác là một con trỏ đến cơ sở của byte đầu tiên của đối tượng thứ nhất trong mảng và không có gì hơn. Đối với những người đến từ Java,.Net, vv, nó rất hữu ích để biết rằng C giữ loại đối tượng/biến hoàn toàn tách biệt với lưu trữ được phân bổ để giữ chúng. Đây là lý do tại sao bạn có thể đúc một con trỏ như là một int, tạo UNIONs, vv Rất, rất linh hoạt, nhưng nguy hiểm cho noobies. Khi bạn cấp phát một mảng int, nó chỉ lưu trữ tại một vị trí. Bạn có thể đặt bất cứ thứ gì bạn thích vào bộ nhớ đó. – user2548100