2013-09-08 39 views
5

Đối số dòng lệnh argc, arv[], được sử dụng với hàm main trong C, chúng được lưu trữ trong bộ nhớ ở đâu?Trong đó các đối số dòng lệnh phân đoạn bộ nhớ được lưu trữ?

Khu vực lưu trữ Tôi đang tìm kiếm câu hỏi này phải là đống, phân đoạn dữ liệu, ngăn xếp hoặc khác.

+2

Tôi nghĩ câu hỏi tương tự ở đây là http://stackoverflow.com/questions/4196201/where-are-cc-main-functions-parameters: –

Trả lời

1

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.)

3

Nó không được chỉ định bởi ngôn ngữ.

Hệ thống giống Unix đặt chúng trên ngăn xếp (hoặc trong trường hợp của một số hệ thống bí truyền hơn, "một" ngăn xếp, vì chúng có nhiều hơn một).

Các vấn đề liên quan