2011-12-22 3 views
7

私の質問は非常にシンプルですが、googleing彼らは私に有用な結果を得ていないことを知っています...彼らはおそらくあまりにも簡単です!Cでポインタアドレスを表示する[2つの質問]

第1

char* createStr(){ 
    char* str1 = malloc(10 * sizeof(char)); 
    printf("str1 address in memory : %p\n", &str1); 
    return str1; 
} 

int main(void){ 
    char* str2 = createStr(); 
    printf("str2 address in memory : %p\n", &str2); 
} 

結果:

str1 address in memory : 0x7fffed611fc8 
str2 address in memory : 0x7fffed611fe8 

なぜアドレスがcreateStr()関数の中に異なると外れているとどのようにすることができます私は無料(STR1)???

第2

int main(int argc, int *argv[]){ 
    printf("Basename is %s ", (char*) argv[0]); 
    if(argc > 1){ 
     printf("and integer arg is : %d.\n", (int) *argv[1]); 
    } 
} 

私がコンパイルし$ ./test 3を実行した場合、どのように私はint型3を得ることができますか?

結果:

Basename is ./test and integer arg is : 1380909107. 
+11

質問ごとに1つの質問をしてください。 –

答えて

6

コメントインライン!

番号1

#include <stdio.h> 
#include <stdlib.h> 

char* createStr(){ 
    char* str1 = malloc(10 * sizeof(char)); 
    /* str1 is a local variable which is allocated in 
     stack and not in heap */ 
    /* But the dynamic memory allocation is done in 
     heap so malloc returns a portion of memory from 
     heap and str1 is made to point to that! 
    */ 
    /* 
    aaaa (stack) bbbb (heap) 
    +--------+  +-+-+-------+-+ 
    | str1 |----->|0|1| ..... |9| 
    +--------+  +-+-+-------+-+ 
    */ 

    printf("address of str1 in memory : %p\n", &str1); 
    /* prints aaaa and not bbbb */ 
    /* to print the base address of the allocated memory, 
    printf("str1 address in memory : %p\n", str1); 
    */ 
    printf("address of the allocated memory inside func : %p\n", str1); 

    return str1; 
} 

int main(void){ 
    char* str2 = createStr(); 
    /* str2 is a local variable to main and so it is 
     allocated in the stack 
    */ 
    /* 
    cccc (stack) bbbb (heap) 
    +--------+  +-+-+-------+-+ 
    | str2 |----->|0|1| ..... |9| 
    +--------+  +-+-+-------+-+ 
    */ 
    printf("address of str2 in memory : %p\n", &str2); 
    /* the above will print the address of the str2 
     (which is cccc) but not where it is pointing 
     to (bbbb) .. 
    */ 
    /* So to print the base address of where it is 
     pointing to (bbbb), 
    printf("str2 address in memory : %p\n", str2); 
    */ 
    printf("address of the allocated memory inside main : %p\n", str2); 
} 

なし2.

#include <stdio.h> 

int atoi(char a[]) 
{ 
     int i, n=0; 

     for (i=0 ; a[i] >= '0' && a[i] <= '9' ; i++) 
       n = 10 *n + (a[i]-'0'); 

     return n; 
} 

int main(int argc, char *argv[]){ 
    printf("Basename is %s ", (char*) argv[0]); 
    if(argc > 1){ 
     printf("and integer arg is : %d.\n", atoi(argv[1])); 
    } 
} 


$ gcc atoi.c -o atoi 
$ ./atoi 3 
Basename is ./atoi and integer arg is : 3. 
$ 

ポイント注:

  • WRT#2:)(主にそれがあるべきchar * argv[]としないint * argv[]
+0

うわー!!!ありがとうございます;) – Psyclops

+0

@Psyclops:これが質問に答える場合は、それに印を付けてください。そうするために、「ダニ」をクリックしてください。 – ArjunShankar

5

最初のものを修正するには:

char* createStr(){ 
    char* str1 = malloc(10 * sizeof(char)); 
    printf("str1 address in memory : %p\n", str1); 
    return str1; 
} 

int main(void){ 
    char* str2 = createStr(); 
    printf("str2 address in memory : %p\n", str2); 
    free(str2); 
} 

そうしないと、あなたは変数str1str2)のアドレスではなく、プリントアウトしています変数が指しているアドレス。

また、メモリリークを修正するためにfree()への呼び出しを追加しました。

秒1、あなたはintに文字列を変換するためにatoi()を使用する必要があるのとおり:最初の例は、文字列を割り当て

printf("and integer arg is : %d.\n", atoi(argv[1])); 
+0

aixありがとうございます!いい説明。 :) – Psyclops

0

、それへのポインタを返します。メソッドの戻り値から代入を行うときは、ポインタを代入するだけです。あなたはたった一つの弦を作りました。

2番目の例では、atoiが必要です。

3

質問1:あなたは、ポインタのアドレスを取っているので、

アドレスが異なっていて、ポインタが保持している変数のアドレスではありません。 のスタック上にmainstr1のスタックにstr2が存在するため、それらのアドレスは異なります。

str1は、同じ場所を指しているので、str2を解放すると解放できます。 str1が指し示すアドレスはがcreateStrから返されたときにstr2にコピーされます。

質問2

使用int value = atoi(argv[1]);これはintchar*に変換します。二exempleについては

+0

乾杯チューダー、ありがとう! – Psyclops

0

*argv[1]char *(すなわち"3")である
あなたがprintf("%s\n", *argv[1]);を使用するか、atoi()を使用して文字列から整数を取得する必要があります"3"表示したい場合。
atoi()の独自のバージョンを作成しようとするかもしれません!

関連する問題