这个 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
.
这是一个思想实验,不是生产代码,也不是好的编码风格。
假设我们有这个函数
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
.