我在64位linux上运行我的C程序。 我已经编写了两个小函数,我将传递一个char数组,它将由函数填充并返回。
我遇到第一个函数func1()的一些问题。
功能是 func1的:
void func1(char *str1)
{
short optiony = 0;
printf("\tfunc1: str1 at %u\n", str1);
printf("\tProvide the option:\n");
scanf("%d", &optiony);
if(optiony== 1)
{
strcpy(str1, "168.98.173.44");
}
printf("\tfunc1: str1 at %u is %s\n", str1, str1);
}
FUNC2:
void func2(char *str2)
{
short optiony= 0;
printf("\tfunc2: str2 at %u\n", str2);
printf("Provide the option:\n");
scanf("%d",&optiony);
if(optiony== 1)
{
strcpy(str2, "168.97.176.146");
}
printf("\tfunc2: str2 at %u is = %s\n", str2, str2);
}
主:
main(int argc, char* argv[])
{
char str1[10] = "\0";
char str2[10] = "\0";
printf("main: str1 at %u\n", &str1);
func1(str1);
printf("main: str1 at %u is %s\n\n", &str1, str1);
printf("main: str2 at %u\n", &str2);
func2(str2);
printf("main: str2 at %u is %s\n", &str2, str2);
return(0);
}
输出结果为:
main: str1 at 4149951616
func1: str1 at 4149951616
Provide the option:
1
func1: str1 at 4149951616 is 168.98.173.44
main: str1 at 4149936112 is
^
|
--------------------------------note the change of address
main: str2 at 4149936096
func2: str2 at 4149936096
Provide the option:
1
func2: str2 at 4149936096 is = 168.97.176.146
main: str2 at 4149936096 is 168.97.176.146
在调用从func1()返回后,主程序中出现的问题是传递给它的变量的地址看起来发生了变化。 因此,函数内部设置的值不会反映在main中。 func2()中没有出现此问题。
此代码中的错误是什么?
答案 0 :(得分:3)
FacebookDisplayName
char str1[10] = "\0";
char str2[10] = "\0";
和str1
的范围从str2
到0
,因此两者都只能容纳9
个字符,最后一个字符为空。
9
加 -
strcpy(str1, "168.98.173.44");// storing more than 10 characters
strcpy(str2, "168.97.176.146");// storing more than 10 characters
打印地址使用printf("main: str1 at %u is %s\n\n", &str1, str1);
^this specifier is to print unsigned int .
。
答案 1 :(得分:2)
对于这个问题。您应该使用%p
打印指针的地址,而不是%u
。