我正试图使用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调用的返回值,看看它是否有效。

关于c - 在地址中使用先前参数时的Sscanf未初始化值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36341018/

10-13 08:21