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

否则,您将打印出变量的地址( str1str2 ),而不是变量指向的地址。

我还添加了一个free()调用来修复内存泄漏。

至于第二个,你需要使用atoi()将字符串转换为int

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

问题1

地址不同,因为您获取指针的地址,而不是指针所包含的变量的地址。 由于str2存在于createStr堆栈上mainstr1的堆栈上,因此它们的地址不同。

您可以通过释放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()版本!