在地址中使用先前参数时 Sscanf 未初始化的值

Sscanf uninitialized value when using prior argument in address

我正在尝试使用 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肯定是访问arr + i的参数计算 before它被设置通过 sscanf。所以你在它初始化之前访问它。

您将需要两次 sccanf 调用;类似于:

int len, i;

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

请注意,您应该 始终 检查 sscanf 调用的 return 值以查看其是否有效。