我正试图使用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/