这个 C 代码有定义的行为吗?

Has this C code a defined behavior?

这是一个思想实验,不是生产代码,也不是好的编码风格。

假设我们有这个函数

int find_process_pid_by_name(char* name, int* threads_in_process);

那个 return 一个命名进程的 PID 并且总是将所述进程中的线程数 运行 存储到 threads_in_process 中。

一个懒惰的程序员,只对 PID 感兴趣,写了这段代码

int pid = find_process_pid_by_name("a process name", &pid);

它会触发未定义的行为吗?

不——我不认为这是未定义的行为。在调用函数之前有一个序列点(在计算了表示被调用函数的参数和表达式之后),在被调用函数之前还有另一个序列点 returns。在函数完成返回之前,被调用函数对 pid 执行的任何副作用都已完成。然后将函数的结果分配给 pid。毫无疑问,分配给函数更改的位置。我没有看到任何调用未定义行为的东西。

我假设被调用函数将 int * 参数视为指向单个值的只写指针。如果它从单个值读取,我们需要知道 pid 之前已初始化(正式地;在实践中,这无关紧要)。上下文中,pid还没有初始化;该函数的结果将对其进行初始化。所以,如果函数从它的指针参数中读取,从技术上讲,你有未定义的行为。如果函数将指针视为多元素数组的开始并访问第零个元素之后,就会出现问题。但这些问题有些超出了 question/discussion.

的预期范围

是的,我相信这段代码定义明确。在将 return 值复制到调用上下文之前,函数末尾有一个序列点。所以函数会先通过threads_in_process间接赋值给pid,然后会return,再把return的值赋给pid.