Chúng tôi đã có một dự án trường học, bất kỳ hệ thống thông tin nào sử dụng C. Để giữ một danh sách sinh viên có kích thước động, tôi đã đi đến một cấu trúc dữ liệu danh sách được liên kết. Sáng nay bạn tôi cho tôi xem hệ thống của anh ấy. Tôi đã rất ngạc nhiên với danh sách hồ sơ của anh ấy:C mảng chưa được đánh dấu toàn cầu?
#include <stdio.h>
/* and the rest of the includes */
/* global unsized array */
int array[];
int main()
{
int n;
for (n=0; n < 5; n ++) {
array[n] = n;
}
for (n=0; n < 5; n ++) {
printf("array[%d] = %d\n", n, array[n]);
}
return 0;
}
Giống như đoạn mã, anh ấy đã khai báo mảng không xác định là toàn cầu (trong phân đoạn bss) cho toàn bộ chương trình. Ông đã có thể thêm các mục mới để mảng bằng cách ghi đè các khối tiếp theo của bộ nhớ với một giá trị khác hơn không để ông có thể đi qua các mảng thusly:
for (n=0; array[n]; n++) {
/* do something */
}
Ông đã sử dụng (Tôi cũng đã thử nghiệm nó với) Turbo C v1 . Tôi đã thử nó trong linux và nó cũng hoạt động.
Vì tôi chưa bao giờ gặp phải kỹ thuật này trước đây, tôi cho là có vấn đề với nó. Vì vậy, yeah, tôi muốn biết tại sao đây là một ý tưởng tồi và tại sao lại thích điều này hơn một danh sách liên kết.
Giống như ghi vào bất kỳ mảng nào ngoài giới hạn - không xác định. – teppic
có phải là c99 không? –
1der Vui lòng kiểm tra câu trả lời cập nhật của teppic.và mở liên kết codepad bạn có thể quan sát hành vi không xác định của C trong mã của bạn. –