2011-12-22 49 views
7

Tôi biết rằng câu hỏi của tôi rất đơn giản nhưng googleing chúng không giúp tôi có được kết quả hữu ích ... Chúng có lẽ quá đơn giản !!In địa chỉ con trỏ trong C [hai câu hỏi]

số 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); 
} 

Kết quả:

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

Tại sao các địa chỉ khác nhau trong và ngoài của createStr() chức năng và làm thế nào tôi miễn phí (str1) có thể ???

số 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]); 
    } 
} 

Nếu tôi biên dịch và chạy $ ./test 3, làm thế nào tôi có thể nhận int 3?

Kết quả:

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

Một câu hỏi cho mỗi câu hỏi, xin vui lòng –

Trả lời

6

Nhận xét nội tuyến!

số 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); 
} 

Không 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. 
$ 

điểm cần lưu ý:

  • wrt # 2: trong main() nó phải được char * argv[] và không int * argv[]
+0

Whow !!! Cảm ơn bạn đã dành thời gian;) – Psyclops

+0

@Psyclops: Nếu điều này trả lời câu hỏi, hãy đánh dấu câu hỏi đó. Nhấp vào 'đánh dấu', để nói. – ArjunShankar

5

Để khắc phục đầu tiên:

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); 
} 

Nếu không, bạn đang in ra địa chỉ của biến (str1str2), không phải là địa chỉ biến được trỏ đến.

Tôi cũng đã thêm một cuộc gọi tới free() để khắc phục tình trạng rò rỉ bộ nhớ.

Như đến một giây, bạn cần phải sử dụng atoi() để chuyển đổi chuỗi thành một int:

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

Cảm ơn bạn aix! Nice lời giải thích. :) – Psyclops

0

Ví dụ đầu tiên phân bổ chuỗi, sau đó trả về một con trỏ đến nó. Khi bạn thực hiện nhiệm vụ từ giá trị trả về của phương thức, bạn chỉ cần gán con trỏ. Bạn chỉ thực hiện một chuỗi.

Trong ví dụ thứ hai, bạn muốn atoi.

3

Câu hỏi 1:

Các địa chỉ khác nhau bởi vì bạn đang dùng các địa chỉ của con trỏ, không phải là địa chỉ của các biến được tổ chức bởi các con trỏ. Vì str2 tồn tại trên chồng mainstr1 trên ngăn xếp createStr, địa chỉ của chúng khác nhau.

Bạn có thể miễn phí str1 bằng cách giải phóng str2, vì chúng trỏ cùng một vị trí. Địa chỉ mà str1 trỏ đến được sao chép bên trong str2 khi str1 được trả về từ createStr.

Câu hỏi 2:

Sử dụng int value = atoi(argv[1]); này chuyển một char* một int.

+0

Chúc mừng Tudor, cảm ơn bạn rất nhiều! – Psyclops

0

Đối với dụ thứ hai: *argv[1] là một char * (nghĩa là "3")
Nếu bạn muốn hiển thị "3" bạn phải sử dụng printf("%s\n", *argv[1]); hoặc nhận được một số nguyên từ chuỗi sử dụng atoi().
Có thể bạn thậm chí có thể thử viết phiên bản atoi() của riêng mình!

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