c-使用地址中的前一个参数时,Sscanf未初始化的值



我正试图使用sscanf(在一个我知道格式良好且不是恶意的字符串上)将值写入数组的特定部分。

#include <stdio.h>
int main(void){
    int arr[10], i;
    sscanf("5 5", "%d %d", &i, arr + i);
}

当我在valgrind中运行这个时,我被告知sscanf行读取了一个未初始化的值。然而,arr被初始化为指向自动分配的数组的指针,i被初始化是因为每个格式说明符都有一个序列点(对于参数之间没有序列点的通用函数来说,情况并非如此)。我可能倾向于认为,之所以会发生这种情况,是因为valgrind不知道格式说明符序列点规则,但在我的完整程序中,这一行会导致实际的分段错误。为什么会发生这种情况?我是不是搞错了格式说明符创建序列点?

问题是,函数调用的序列点意味着i在被sscanf设置之前,肯定被访问用于arr + i的参数计算。因此,您在初始化之前访问它。

您需要两个sccanf呼叫;类似于:

int len, i;
if (sscanf(buf, "%d%n", &i, &len) >= 1 && sscanf(buf+len, "%d", arr + i) >= 1) {
    // successful sscanf 

请注意,您应该检查sscanf调用的返回值,看看它是否有效。

最新更新