Khi torek cho biết trong số answer của mình, ngôn ngữ C không xác định nơi đối số dòng lệnh phải được lưu trữ và không có nhiều cách sử dụng thực tế để biết. Tuy nhiên, thông tin thường được lưu trữ trên ngăn xếp.
Mã này sử dụng phần mở rộng chung cho main()
để giữ môi trường, sau đó in địa chỉ của cả đối số và môi trường.
#include <stdio.h>
#include <inttypes.h>
int main(int argc, char **argv, char **envp)
{
printf("&argc = 0x%.8" PRIXPTR "\n", (uintptr_t)&argc);
printf("&argv = 0x%.8" PRIXPTR "\n", (uintptr_t)&argv);
printf("&envp = 0x%.8" PRIXPTR "\n", (uintptr_t)&envp);
while (*argv != 0)
printf("*argv = 0x%.8" PRIXPTR "\n", (uintptr_t)*argv++);
while (*envp != 0)
printf("*envp = 0x%.8" PRIXPTR "\n", (uintptr_t)*envp++);
return 0;
}
Khi chạy trên máy Mac của tôi, nó đã cho thấy:
&argc = 0x7FFF5494B52C
&argv = 0x7FFF5494B520
&envp = 0x7FFF5494B518
*argv = 0x7FFF5494B748
*envp = 0x7FFF5494B74E
*envp = 0x7FFF5494B839
*envp = 0x7FFF5494B862
*envp = 0x7FFF5494B86D
*envp = 0x7FFF5494B889
*envp = 0x7FFF5494B8C1
*envp = 0x7FFF5494B8F4
*envp = 0x7FFF5494B905
*envp = 0x7FFF5494B915
*envp = 0x7FFF5494B920
*envp = 0x7FFF5494B92E
*envp = 0x7FFF5494B93B
*envp = 0x7FFF5494B974
*envp = 0x7FFF5494B998
*envp = 0x7FFF5494B9CD
*envp = 0x7FFF5494B9F2
*envp = 0x7FFF5494BA0B
*envp = 0x7FFF5494BA2A
*envp = 0x7FFF5494BA46
*envp = 0x7FFF5494BA7B
*envp = 0x7FFF5494BB2E
*envp = 0x7FFF5494BB3C
*envp = 0x7FFF5494BB76
*envp = 0x7FFF5494BB87
*envp = 0x7FFF5494BB9D
*envp = 0x7FFF5494BBC8
*envp = 0x7FFF5494BBEA
*envp = 0x7FFF5494BC2B
*envp = 0x7FFF5494BC35
*envp = 0x7FFF5494BC51
*envp = 0x7FFF5494BC5F
*envp = 0x7FFF5494BC75
*envp = 0x7FFF5494BC82
*envp = 0x7FFF5494BD55
*envp = 0x7FFF5494BD7E
*envp = 0x7FFF5494BD96
*envp = 0x7FFF5494BDA3
*envp = 0x7FFF5494BDAE
*envp = 0x7FFF5494BDBF
*envp = 0x7FFF5494BDCA
*envp = 0x7FFF5494BDE8
*envp = 0x7FFF5494BE01
*envp = 0x7FFF5494BE09
*envp = 0x7FFF5494BE1E
*envp = 0x7FFF5494BE38
*envp = 0x7FFF5494BE52
*envp = 0x7FFF5494BE71
*envp = 0x7FFF5494BE7D
*envp = 0x7FFF5494BEF5
*envp = 0x7FFF5494BF16
*envp = 0x7FFF5494BF27
*envp = 0x7FFF5494BF32
*envp = 0x7FFF5494BF66
*envp = 0x7FFF5494BF8D
Đó là khá unexciting, nhưng cho thấy rằng tất cả các địa chỉ nằm trong khu vực chung giống nhau, đó là C stack. (Được thử nghiệm trên Mac OS X 10.8.4 - Chương trình 64 bit, được gọi mà không có bất kỳ đối số dòng lệnh nào và môi trường lớn.)
Nguồn
2013-09-08 06:49:44
Tôi nghĩ câu hỏi tương tự ở đây là http://stackoverflow.com/questions/4196201/where-are-cc-main-functions-parameters: –