2
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

extern char **environ;

int global_x = 10;                  // initialised global variable
int global_y;                       // un-initialised global variable
char global_array1[] = "Hello, world!";     // initialised global array and a string literal
char global_array2[10];             // un-initialised global array
char *global_pointer1 = "bye!";         // global pointer to a string literal 
char *global_pointer2;              // un-initialised global pointer 
float global_float = 100.1;         // initialised global variable
double global_double;               // un-initialised global variable

#define ONEGB  1073741824
#define ONEMB  1048576
#define ONEKB  1024

char *addr(unsigned long a)
{
    unsigned long r; // remainder

    r = (unsigned long) a;
    int gb = (int) ( r / ONEGB );

    r -=  gb * ONEGB;
    int mb = (int) ( r  / ONEMB );

    r -=  mb * ONEMB;
    int kb = (int) ( r  / ONEKB );

    r -=  kb * ONEKB;
    int b  = (int) ( r );

    char *p = malloc(64);

    sprintf(p, "%4dGB, %4dMB, %4dKB, %4d", gb, mb, kb, b);
    return p;
}

int f2(int x)
{
    char * f2_p;
    int f2_x = 21;

    f2_p = malloc(1000);         // dynamically allocated memory

    // print out the address of x
    // print out the addresses of f2_p, and f2_x
    // print out the starting address of the dynamically allocated memory
    .....

    L: f2_x = 10;
    return f2_x;
}

void f1(int x1, int x2, float x3, char x4, double x5, int x6)
{
    int f1_x = 10;
    int f1_y;
    char *f1_p1 = "This is inside f1";   // pointer to another string literal 
    char *f1_p2;

    f1_p2 = malloc(100);         // dynamically allocated memory

    // print out the addresses of x1, x2, x3, x4, x5, x6
    // print out the addresses of f1_x, f1_y, f1_p1, f1_p2
    // print out the address of the string literal "This is inside f1"
    .....

    f1_y = f2(10);
    return;
}

int main(int argc, char *argv[])
{

    // print out the addresses of argc, argv
    // print out the starting address and end address of the command line arguments of this process
    // print out the starting address and end address of the environment of this process
    // print out the starting addresses of function main, f1, and f2
    // print out the addresses of global_x, global_y, global_array1, global_array2, global_pointer1,
    //           global_pointer2, global_float, global_double
    // print out the addresses of string literals 10, "Hello, world!", "bye", 100.1

    ..... 

    // call function f1 with suitable arguments such as 12, -5, 33.7, 'A', 1.896e-10, 100 
    f1( .... );

    exit(0);
}

Google で検索しようとしましたが、sth が役に立たないことがわかりました。この場合、動的に割り当てられたメモリの開始アドレスを出力する方法を知りたいだけです。このプロセスのコマンド ライン引数の開始アドレスと終了アドレスを出力します。このプロセスの環境の開始アドレスと終了アドレスを出力します。関数 main、f1、および f2 の開始アドレスを出力します。誰でも私を助けることができます?..ありがとう!

4

5 に答える 5

0

f1 と f2 ((パラメータ) ブロックなし) は、関数の開始アドレスです。f2(x); パラメータ x を渡して関数 int f2(int x) を呼び出します。括弧なしの「f2」は、関数 int f2(int x) のアドレスです。

于 2012-09-26T11:54:40.080 に答える
0

main

argc, argv -のアドレスを印刷します。printf ("%d, %d", &argc, argv);

このプロセスのコマンドライン引数の開始アドレスと終了アドレスを出力します -printf ("%d", (void *)argv);

このプロセスの環境の開始アドレスと終了アドレスを出力します -printf ("%d", (void *)environ);

関数の開始アドレスを出力しますmain, f1, and f2-printf ("%d %d %d", &main, &f1, &f2);

のアドレスを出力しますglobal_x, global_y, global_array1, global_array2, global_pointer1, global_pointer2, global_float, global_double-&アドレスを出力したい各変数の前に演算子を使用してください。

文字列リテラルのアドレスを出力する - 文字列リテラルのアドレスを出力すること10, "Hello, world!", "bye", 100.1は許可されていません。

f1

x1、x2、x3、x4、x5、x6 のアドレスを出力します -printf ("%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5);

f1_x、f1_y、f1_p1、f1_p2 のアドレスを出力します -printf ("%d %d %d %d", &f1_x, &f1_y, f1_p1, f2_p2);

文字列リテラルのアドレスを出力する"This is inside f1"- 文字列リテラルのアドレスを取得することは許可されていません

f2

x のアドレスを出力 -printf ("%d", &x);

f2_p と f2_x のアドレスを出力しますprintf("%d", f2_p, &f2_x)

動的に割り当てられたメモリの開始アドレスを出力します -printf ("%d", f2_p);

于 2012-09-26T11:54:59.160 に答える
-1

そのためには & 演算子が必要です。変数のアドレスを取ります

ポインター演算子の詳細については、こちらを参照してください

通常の変数の開始アドレスに:

printf("%p", &variable);

これらの変数には実際には終了アドレスはありませんが、必要なものは次のようなものだと思います:

printf("%p", (&variable + 1));

次に利用可能なアドレスを出力します

于 2012-09-26T11:54:22.517 に答える
-1

変数のアドレスを確認したい場合は、&演算子またはストレート ポインターを使用する必要があります (動的に割り当てられたメモリの場合)。

int main(int argc, char *argv[]){  
   int * arr;
   int i = 0;
   arr = malloc(100 * sizeof(int));
   printf("dynamic array starts at: %#x and ends at: %#x\n",arr,arr+100);
   printf("static i is at: %#x\n",&i);
}

出力:

mike@linux-4puc:~> ./a.out 
dynamic array starts at: 0x804b008 and ends at: 0x804b198
static i is at: 0xbfc1f6d8
于 2012-09-26T12:17:56.323 に答える