【发布时间】:2015-07-28 14:00:05
【问题描述】:
我在 64 位 Linux 上运行我的 C 程序。 我写了两个小函数,我将向它们传递一个 char 数组,它会被函数填充并返回。
我在使用第一个函数 func1() 时遇到了一些问题。
功能是 功能1:
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);
}
函数2:
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.h 中。 func2() 中没有出现此问题。
这段代码有什么错误?
【问题讨论】:
-
printf 地址与
%p格式说明符。并且不要使用%d扫描短裤,而是使用int。 -
字符串比
char []s长。 -
提高您的警告级别,您会发现由于使用了错误的格式说明符而导致的大量警告,从而导致未定义的行为
-
@CoolGuy 他可能使用 Turbo C++,它不会警告错误的格式说明符。
-
@MichaelWalz 如果有人可以让 Turbo C++ 在 64 位 linux 上运行,他们可能知道格式说明符 :)