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