在C中打印指针地址
我知道我的问题非常简单,但谷歌他们并没有给我任何有用的结果……他们可能太简单了!!
第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.
评论内联!
第1名
#include #include 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 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:在main()中它应该是
char * argv[]
而不是int * argv[]
修复第一个:
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); }
否则,您将打印出变量的地址( str1
和str2
),而不是变量指向的地址。
我还添加了一个free()
调用来修复内存泄漏。
至于第二个,你需要使用atoi()
将字符串转换为int
:
printf("and integer arg is : %d.\n", atoi(argv[1]));
问题1 :
地址不同,因为您获取指针的地址,而不是指针所包含的变量的地址。 由于str2
存在于createStr
堆栈上main
和str1
的堆栈上,因此它们的地址不同。
您可以通过释放str2
来释放str2
,因为它们指向相同的位置。 当从createStr
返回str2
时, str1
指向的地址将复制到str2
。
问题2 :
使用int value = atoi(argv[1]);
这会将char*
转换为int
。
第一个示例分配字符串,然后返回指向它的指针。 从方法的返回值进行赋值时,只需指定指针即可。 你只做了一个字符串。
在第二个例子中,你想要atoi
。
对于第二个例子: *argv[1]
是一个char *
(即"3"
)
如果要显示"3"
,则必须使用printf("%s\n", *argv[1]);
或使用atoi()
从字符串中获取整数。
也许你甚至可以尝试编写自己的atoi()
版本!