Dưới đây là một ví dụ mã sau đó là câu hỏi của tôi:Tuyên bố gán cấu trúc C này có hợp pháp không?
#include <stdio.h>
#include <string.h>
struct st {
char stringField[100];
int intField;
};
typedef struct st st;
void test(st *parameterStruct)
{
st localStruct;
strcpy(localStruct.stringField, "HELLO");
localStruct.intField = 5;
*parameterStruct = localStruct;
}
int main()
{
st myStruct;
strcpy(myStruct.stringField, "XXX");
myStruct.intField = 9;
printf("%s,%i\n", myStruct.stringField, myStruct.intField);
test(&myStruct);
printf("%s,%i\n", myStruct.stringField, myStruct.intField);
return 0;
}
OUTPUT:
XXX,9
HELLO,5
Tôi đã suy nghĩ rằng kể từ khi cấu trúc 'localStruct' được tạo ra bên trong một hàm (KHÔNG sử dụng malloc) nó có phạm vi địa phương và do đó các vị trí bộ nhớ mà nó được lưu trữ được tự do để được ghi đè khi chức năng ngừng thực hiện. Tuy nhiên, tôi đã thử chạy chương trình mẫu này và nó được thực thi mà không có vấn đề gì. Tôi đã suy nghĩ rằng các báo cáo in thứ hai sẽ in gibberish vào màn hình kể từ khi tôi được giao 'myStruct' để biến địa phương 'localStruct' (so với 'localStruct' được tự động phân bổ). Tôi biết nếu 'localStruct' đã được tạo ra bằng cách sử dụng malloc sẽ không có vấn đề như vậy.
Câu hỏi của tôi: là gán biến cấu trúc 'myStruct' (biến cục bộ không động) cho y bằng cách sử dụng con trỏ trong kiểm tra hàm không sao và an toàn để làm? Tôi hy vọng rằng câu hỏi là rõ ràng.
Câu hỏi bằng văn bản với SSCCE, bạn tốt sir xứng đáng được +1. –
(Chỉ nitpick: có lẽ tiêu đề có thể được cải thiện thành cái gì đó ít chung hơn?) – usr2564301