Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么奇怪的值会在C语言代码中出现不必要的%转换?_C_Xcode - Fatal编程技术网

为什么奇怪的值会在C语言代码中出现不必要的%转换?

为什么奇怪的值会在C语言代码中出现不必要的%转换?,c,xcode,C,Xcode,我几天前才开始学习编程,所以基本上我没有任何知识 我从C开始,我写了一个非常简单的代码: int main (int argc, const char * argv[]) { printf("%d + %d", 1 + 3); return 0; } 在上面的代码中,我得到了4+1606416608的值,后来发现返回值是错误的,因为我输入的%d超出了需要。那么我的问题是,这个奇怪的值究竟是如何产生的?如果有人知道,请帮助我。谢谢 您处于未定义的行为领域。。。你告诉一个变量函

我几天前才开始学习编程,所以基本上我没有任何知识

我从C开始,我写了一个非常简单的代码:

int main (int argc, const char * argv[])

{

    printf("%d + %d", 1 + 3);
    return 0;
}

在上面的代码中,我得到了4+1606416608的值,后来发现返回值是错误的,因为我输入的%d超出了需要。那么我的问题是,这个奇怪的值究竟是如何产生的?如果有人知道,请帮助我。谢谢

您处于未定义的行为领域。。。你告诉一个变量函数你有2个
int
大小的参数,然后你只提供一个,你从堆栈中泄漏了一些东西

您的代码需要打印两个数字参数,而您给了它一个

预期:

printf("%d + %d", <some_num>, <another_num>);

您已经知道自己做错了什么,因此要解释您的特定C实现可能做了什么:

调用
printf
时,会将新的堆栈帧推送到调用堆栈中。调用堆栈是后进先出结构,每个被调用函数有一个“帧”。因此,如果
main
调用了
logStuff
,调用了
printf
,那么三个连续的帧将分别用于main、logStuff和printf。当printf返回时,它的框架将从结构中移除,并使用logStuff继续执行

因此,一个框架通常至少包含传递给函数的参数和局部变量的存储器。这些事情可能是一样的,它取决于实现

对于像
printf
这样的变量函数,有一系列未命名的参数。位模式将放在帧中的适当位置。但C语言不是一种反思性语言。每一位模式都没有固有的意义:任何一位都可以是整数、浮点或其他任何形式。它也不是一种投资于边界检查的语言。您可以编写正确运行的代码

printf
确定字符串中未命名参数的类型和数量。因此,如果你给了它错误的信息,它会用它们的正确含义以外的东西来解释位模式,它可能会认为比实际情况要少或多

你告诉它还有更多。因此,可能发生的情况是,参数位于数组的等效位置,它从数组的末尾读取一个值。由于它完全依赖于实现,所以该值可能表示任何内容。可能是来电者的地址。它可能是另一个局部变量的未初始化存储。可能是记账。它可能是格式字符串,错误地解释为整数

它不是任何可靠的价值。它甚至可能并不总是安全读取。

1)
%d
是一个格式说明符,它告诉编译器如何访问存储在特定位置的值。(此处为整数)

2) 对于每个格式说明符,您需要提供相应的变量或值,否则在运行时您将得到“垃圾”,即一些随机值。 例如:

int main()
{
int a = 65;
printf("\na = %d", a); // here the value stored in a is accessed as an integer.
printf("\na = %c", a); // the value inside a is accessed as a character.
return 0;
}
在上面的示例中,第一个
printf
语句中的
'%d'
告诉编译器存储在变量a中的值将作为整数访问。(o/p-65)


在第二个
printf
语句中,
'%c'
用于访问与字符相同的变量。(o/p-a)

必需的参数不匹配。所以
printf
读取一个随机值。试试printf(“%d+%d=%d\n”,1,3,1+3)@MarshallLee您可以接受正确答案并投票表决。仅限未发现泄漏。(好吧,在所有实现中,可变函数都是调用方清理)。@重复数据消除或不是内存泄漏,而是信息泄漏。。众所周知,程序应仅支持常量格式化程序以防止格式字符串攻击:
printf("%d + %d = %d", 1, 3, 1+3);
int main()
{
int a = 65;
printf("\na = %d", a); // here the value stored in a is accessed as an integer.
printf("\na = %c", a); // the value inside a is accessed as a character.
return 0;
}